首页 > 其他分享 >8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正

时间:2022-11-12 10:02:19浏览次数:56  
标签:矫正 -- 鱼眼 标定 摄像机 Matlab 图像 摄像头

前言:最近项目上研究鱼眼摄像头的画面畸变问题,对比了基于Matlab和Python Opencv的方法,分别进行了摄像头的标定和图像矫正,实际结果个人认为Opencv的效果为佳,本文分享一下基于Matlab的鱼眼摄像头标定和图像畸变矫正

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_fish

关键字:鱼眼摄像头;摄像头标定;图像畸变矫正


1、鱼眼摄像头介绍

鱼眼摄像机可以独立实现大范围无死角监控的全景摄像机,其概念与初级成品诞生已久,但成熟商用产品直到08年才正式出现。又因为国内安防方面的标准大多围绕模拟摄像机与网络摄像机展开,故此对于全景摄像机还没有较为统一的标准定义,使得在具体到某些项目实施的过程中会存在认同度方面的问题。总的说来,当下主流全景摄像机采用吊装与壁装方式可分别达到360°与180°的监控效果,而某些只有120°到130°视场角的摄像机,因为能达到客户对一个较为开阔面积的监控诉求,亦可被称为全景摄像机。

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_fish_02

图1:安防鱼眼摄像头

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_数据_03

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_摄像头标定_04

图2:车载鱼眼摄像头(倒车雷达)


2、Matlab鱼眼摄像头标定

2.1 采集标定数据

常规使用的是棋盘标定法,所以用的标定块如下图所示。这个标定板可以自己网上下载一个,或者用matlab画一个,这个不是很难。注意一点,在用摄像头采集数据的时候,要保证标定板是处于一个平整的位置。我用的比较简陋,就直接打印在纸上,平铺在桌面上,进行数据采集了。这里可以拍20张左右,多变换一点角度,还有距离。

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_fish_05

图3:标定棋盘

采集的数据类似如下图,

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_fish_06

图4:采集的数据集

2.2 基于App的摄像头标定

在Matlab App中找到摄像头标定


点击Camera Calibrator这个应用,显示如上图案,点击add images,

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_fish_07

程序会要求输入棋盘的边长,这个要自己进行测量,当然测量要尽量准确。

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_fish_08

添加之前制作好的数据集,它会经过一定的筛选,剔除不合格的图片。


8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_fish_09

matlab会给每张图片建坐标系。

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_摄像头标定_10

选择自己要矫正的参数,点击按钮calibrate,进行对相机进行标定。

以棋盘为中心的相机的位姿图

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_摄像头标定_11

以相机为中心的棋盘的位姿图

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_摄像头标定_12

最后选择export camera parameters,将我们需要的内参进行导出。

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_fish_13

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_摄像头标定_14

2.3 基于代码的标定

Matlab自带函数可以直接实现标定,本文图片是Matlab自带的图片,仅供讲解说明。

% 图片集合
images = imageDatastore(fullfile(toolboxdir('vision'), 'visiondata','calibration', 'gopro'));
imageFileNames = images.Files;

% 标定边框
[imagePoints, boardSize] = detectCheckerboardPoints(imageFileNames);


% 生成标定格子的实际坐标
squareSize = 0.029; % 标定格子大小
worldPoints = generateCheckerboardPoints(boardSize, squareSize);


% 标定摄像头
I = readimage(images, 1); % 任取其中一张图片
imageSize = [size(I, 1), size(I, 2)];% 获取图片长宽
params = estimateFisheyeParameters(imagePoints, worldPoints, imageSize);

任意打开一张鱼眼照片测试效果

imageFileName = fullfile(toolboxdir('driving'), 'drivingdata', 'checkerboard.png');
I = imread(imageFileName);
imshow(I)

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_摄像头标定_15

进行画面矫正

% 画面矫正
[J1, camIntrinsics] = undistortFisheyeImage(I, params.Intrinsics, 'Output', 'full');
imshow(J1)


可以看出Matlab是把整张图全部进行了矫正,导致了4个角落出现尖锐画面,同时画面上下左右出现黑框,为了更好地使用照片,还需要把图片裁剪(imcrop函数),期望输入如下图;

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_数据_16


启发思考:在现在的高档车上一般配备有360°环绕视频功能(效果下图),给行车带来了极大便利,尤其是我这种不擅于倒车的

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_摄像头标定_17

,其基本原理和本文类似,感兴趣的读友可以思考一下它怎么实现的,后续也将分享其做法

8.图像视觉(1) --鱼眼摄像头标定和图像畸变矫正_数据_18


标签:矫正,--,鱼眼,标定,摄像机,Matlab,图像,摄像头
From: https://blog.51cto.com/domi/5846530

相关文章

  • 元进Python(4)---networkx制作我最喜爱55部美剧天体排名
    利用networkx和matplotlib给我最喜爱的55部美剧来个天体排名【最终呈现效果】【代码实现及注释】importnetworkxasnximportmatplotlib.pyplotaspltUSTVNode=['Everybo......
  • 学Java· 从new说对象实例化
    概念了解想要知道内存中发生了什么,我们先来了解两个内存概念......
  • 计算机网络:随机访问介质访问控制之令牌传递协议
    在轮询访问中,用户不能随机地发送信息,而要通过一个集中控制的监控站,以循环方式轮询每个结点,再决定信道的分配。当某结点使用信道时,其他结点都不能使用信道。典型的轮询访问介......
  • Codeforces 1738 / Codeforces Global Round 22
    目录ContestLinkProblemAGloryAddictsProblemBPrefixSumAddictsProblemCEvenNumberAddictsProblemDPermutationAddictsProblemEBalanceAddictsProblemF......
  • 冒泡排序(数组中的问题)
    问题:使用冒泡排序的方法,将数组中的元素按照升序的方式将其排列。冒泡排序核心思想:两两相邻元素进行比较,满足条件则交换;     ①先确认趟数;     ②写下一趟冒泡......
  • 那些年被误解的指针和数组
    误解1:&运算符返回一个地址解释:  &叫做取址运算符,运算的结果是返回一个指向某个数据类型对象的指针。    inta=1; int*p=&a;       &a不是地址,&a是......
  • 「题解」Codeforces 1342F Make It Ascending
    只会\(\mathcal{O}(3^nn^2)\),打开题解一看怎么还真是这个玩意/jy首先集合之间形成一个sum和pos的二维偏序,那么思路就是对一维扫描线,然后另一维搞个什么东西。具体到......
  • Linux下的网络管理工具—OpenNMS
    OpenNMS的是一个运营商级别的,高度集成的,开放源码的平台,用于构建网络监控解决方案。OpenNMS有两个发行版:MeridianandHorizon。使用Meridian是可取的,对企业提供稳定和长期的......
  • XAMPP phpmyadmin 设置局域网访问
    1.问题描述本地local和127.0.0.1访问都正常,局域网访问失败,显示以下内容:2.检查用户的主机名是否是任意主机(%)3.修改httpd-xampp.conf配置文件找到phpmyadmin这一行,......
  • linux服务器中JDK的安装和配置
    目录​​一、安装配置过程如下:​​​​1.新建jdk文件夹(/usr/local/jdk)​​​​2.将jdk.tar.gz包解压到jdk文件夹下​​​​ 3.jdk包解压后​​​​4.进入JDK环境变量添加......