700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > matlab鱼眼镜头 普通镜头 单目双目相机标定校正(四)

matlab鱼眼镜头 普通镜头 单目双目相机标定校正(四)

时间:2020-10-04 10:50:49

相关推荐

matlab鱼眼镜头 普通镜头 单目双目相机标定校正(四)

写这篇文章的目的,是记录相机标定过程和问题,经过试验,记录问题

1、单目相机与双目相机的标定、区别、目的

2、相机拍照时,距离标定板的距离

3、填写参数时、黑白格的大小有影响?

4、参数的设置

5、拍摄过程,要注意哪些事项,否则影响结果

一、单目相机标定和双目相机标定目的

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。比如做投影,全景图,由三维到二维,二维到三维的空间转换,通过标定获取相机内参,实现转换,关于坐标系转换,学习其他文章。

原理是根据摄像机模型,由已知特征点的图像坐标求解摄像机的模型参数,从而可以从图像中恢复出空间点的三维坐标。相机标定主要是为了获得摄像头的内参、畸变参数和外参。所要求解的参数包括5个内参(f,1/dx,1/dy,cx,cy)和5个畸变参数(k1,k2,k3,p1,p1),对于外参数(R,t),即旋转矩阵R的三个旋转参数和平移向量t的三个参数。

内参矩阵A,外参矩阵[R|T]、畸变系数[k1、k2、k3、P1、P2]。内参矩阵各元素意义:一个像素的物理尺寸dx和dy,焦距f,图像物理坐标的扭曲因子gama,图像原点相对于光心成像点的的纵横偏移量cx和cy(像素为单位)。外参矩阵:世界坐标系转换到相机坐标系的旋转R和平移T矩阵。畸变系数:包括相机的径向畸变系数k1,k2,k3,~,和相机的切向畸变系数p1、p2。

单目相机标定的结果就是得到相机内参与畸变系数。

双目相机标定的结果就是得到相机内参与畸变系数和外参(旋转和平移矩阵)。

单目或双目相机标定的目的:

1、(建立像素坐标系和世界坐标系之间的关系)像素坐标-> 图像坐标-> 相机坐标-> 世界坐标

2、(单目或双目鱼眼镜头畸变校正)

如果是鱼眼相机会出现如下桶型(切向)畸变和枕型(径向)畸变,更多畸变原理自己去学习其他文章。

3、(双目相机立体校正)。

双目校正就是通过一定的方法将两个摄像头拍摄同一个物体的图像进行处理,使得两幅图像最终达到下面的目标,同一个物体在两幅图像中的大小一样,且水平在一条直线上,如果是做融合,或识别,连个物体不在同一水平线,将无法融合在一起。

二、网上抄的棋盘格生成代码

可以代码生成自己打印,可以网上找图片打印,可以买现成的打印图

#include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace cv;using namespace std;void main(){//---生成标定图IplImage *img;int chess_size = 500;int dx = 10; //棋盘格大小,像素为单位int dy = 7;//棋盘格数目img = cvCreateImage(cvSize(chess_size*dy, chess_size*dx), IPL_DEPTH_8U, 1);cvZero(img);int flag = 0;for (int i = 0; i < dx; i++)for (int j = 0; j < dy; j++){flag = (i + j) % 2;if (flag == 0){for (int m = i*chess_size; m < (i + 1)*chess_size; m++)for (int n = j*chess_size; n < (j + 1)*chess_size; n++)*(img->imageData + m*img->widthStep + n) = 255;}}cvSaveImage("标定图2.jpg", img);// 生成的棋盘格图保存在该工程目录下cvNamedWindow("cab", 1);cvShowImage("cab", img);char ch = cv::waitKey(0);if (ch == 27){exit(0);}//system("PAUSE");//---END生成标定图}

三、单目相机、MATLAB获取标定参数

1、拍取棋盘格图片和注意事项

1、调试好焦距,固定好镜头,使图像成像清晰。

2、选择合适的标定距离、如2米、2米、5米,这要看拍摄的距离,处在这一标定距离附近的物体图像,比较好,其他距离会有差异,这和焦距有关,一旦焦距确定,镜头固定,后面标定后,不能再挪动,否则,标定不准确,图像效果差,采集标定板图片需要在相机各个方位进行拍摄,不要在同一个位置获取多张图片。

3、选定距离后,标定板的大小根据相机视野而定,一般选择棋盘格图案占相机拍的的图片大小2/3左右。

4、如棋盘格子宽高应为25mm为多:棋盘格精度会直接影响标定结果,高精度场景需要购买高精度的棋盘格,自行打印的棋盘格一般精度较低,视使用需求而定。

下面是我不同角度拍摄的照片,本人测试发现校正效果不太理想,后面今天过来总结,分析。可能是棋盘格尺寸不合适,拍摄的棋盘格图片没有占整幅图像的2/3左右,太小。拍摄距离不对选的3米,要根据实际情况而定。填写的尺寸参数不对,实际量的是75mm,填写的是25mm。还有拍摄时,最好不要有如下强光,画面的强光和棋盘白色相似。这些可能造成测量计算的结果有误差,当时没有学习到正确的文章,还有本人做的是双目融合项目,两个相机焦距,分辨率,清晰度不一样,导致标定,立体校正的效果很差,拍摄的同一物体,同一清晰度下,物体大小,水平位置都不一样,相机放置不在同一高度,有微小偏差,导致融合重叠不到一块,这真是强人所难,项目没怎么做成。

最理想的应该是如下,虽然后面没有验证过,这是别人的。注释一下,图片格式可以是jpg,bmp的,其他的,我不知道。

2、打开软件

找到工具箱,选择APP->图像处理和计算机视觉->单目相机标定模块

有两个,一个是单目镜头标定,一个是双目镜头标定,我做的项目是单目的,选第一个,如果是双目的,选第二个

3、导入图图片

选择from fill,这里要快捷键ctrl + a 全选中图片

4、设置参数

如果是鱼眼相机,选如下,注释:这里忘了要选standard标准还是fisheye鱼眼了,可以自己尝试看结果。

桶型畸变和径向畸变RadialDistortion和TangentialDistorition(分别对应畸变模型的径向畸变(k1,k2,k3)和切向畸变(p1,p2))

2 Coefficients 表示计算2个畸变参数:k1/k2;

3 Coefficients 表示计算3个畸变参数:k1/k2/k3。

一般来说选择计算2个畸变参数即可。计算3个畸变参数时,k3值比较小,大概量级为1e-5,可以忽略(实际计算过程中,如果考虑太多高阶的畸变参数,会导致标定求解的不稳定。如果选择了计算3个畸变参数,需要注意畸变矩阵的排列顺序:[k1,k2,p1,p2,k3])。

我们最终需要得到的参数如下图:

如果只想获取相机内参,可以只选如下设置,如果是非鱼眼相机,也可以这样,不需要畸变。

4、选standard标准相机校正前后

校正前的图片点击calibrat校正,校正后,点击show undistorted,可以看到校正前后对比,来回切换观看,效果。我的鱼眼相机拍摄的,校正后,图片曲线明显被拉直,拍的歪曲棋盘被拉直,效果不错,

去除差异较大的图片,如下图,消除误差。

另一张图校正前

另一张图校正后

5、选fisheye鱼眼相机校正后

这里只是演示,不是要选standard和fisheye,只需选其中一种。校正前如上图,校正后,拉伸是这样的,我的是鱼眼相机拍摄的,应该是选这样模式,但是option不能选畸变参数,不知道为啥,可以通过fisheye scale,来调整缩放比例,拉伸尺度。但是导出的参数,如下图,只有外参,旋转平移矩阵,没有畸变系数和内参,为什么?不知道是不是版本的原因,和的版本不一样。还是选fisheye,不能得到畸变系数和内参,只得选standard,结合起来。还是因为我的拍摄的棋盘问题,得到错误的结果,导不出参数。真抓狂,只有一个单目镜头,不需要旋转,平移的啊,更需要内参和畸变系数的。不懂,不懂。

6、选standard标准相机导出参数

通过点击show ,可以切换校正前后的效果图像,然后export导出参数

下图是上面步骤设置参数时,矩阵参数排序,一般不用设置,默认,但是下面弹出的排序,是有用的信息,根据排序,就知道怎么把导出的参数对应到矩阵,不同的版本好像有区别。

7、点击展开后,如下咱们先看这两个参数

focallenth可以看到镜头的焦距中心是有偏移的,就是焦距中心,fx,fy,我的相机是800x600的分辨率,本应该是400,300的,但是focallenth偏差这么大,可能是我拍棋盘格图像的问题,离相机较远,角度问题,所以后面导致我做出来的图像差异较大,实际拍好,和400,300差不了多少,后面我找了更大的尺寸的棋盘和更近距离,重新拍摄过。

intrinsismatrix,就是下面的内参矩阵,根据前面设置MATLAB参数时,参数的格式顺序,可以知道上面的9个参数,结合设置排序对照过去,fx = 415.9364,f = 417.1626,图中的U0,V0,就是CX,CY,畸变中心。

RadialDistortion:径向畸变系数K1,K2,

TangentialDistortion:切向畸变系数P1,P2,

Ratation展开后R旋转矩阵其中一组,不知道为啥有14张图,就有14组,好像是一张图对应一个角度,一个空间坐标,就有对应的旋转矩阵

Translation展开后平移T矩阵其中一组,不知道为啥有14张图,就有14组,好像是一张图对应一个角度,一个空间坐标,就有对应的平移矩阵

总结:填入一组参数到算法程序中,进行实时观看,发现,确实不通角度,对应不同的效果,左边标定好,可能效果好,但是右边不好,不同远近距离也会有差异。所以如果标定2米,就看2米的,如果要看5米的,还要调好焦后,再从新计算标定参数,导入算法中,所以,是不是如果是拍摄实时的视频,想看不同远近距离,就要输入对应的映射参数表。未知。

四、双目相机立体标定

1、加载图片设置参数标定

选择第二个双目相机

将拍摄好的连个相机图片,分别放在两个文件夹中,导入图片,设置大小,我的是75mm,设置参数如下。

加载的时候,会去掉一些差异比较大的照片,需要一起拍,同时对准棋盘,我的是微光和红外,可以加热的棋盘,都可以拍摄到棋盘格,

校正后,看柱状图,图片差异较大,不知道是不是加热板的问题,红外拍的不清楚,看MATLAB标定角点时,标出的+号,明显不对,所以,导不出参数,效果也是不对的,可能后面需要放在合适的位置,温度环境下,拍的图片才能正常,如果是两个普通的相机,应该不存在这样的问题。

点击show rectify,在线观看调试校正效果,明显变形,不对了,视场角变小了。

如下两图,是opcv里的,拍摄的效果很好的图片,

鱼眼校正,立体标定后,图片被拉直,上下对齐,看直线,棋盘格的黑线,白线,点都对齐了。这个才是我们需要的效果,也才明白,立体标定,是垂直方向的对齐,不是水平方向的对齐,水平方向,一个左右,是永远对不齐的,上下垂直是可以通过矩阵进行旋转,平移对齐的,如果要做图片融合,上下对齐后,物体才能被重合,左右需要通过算法,自己平移,融合。

标定后将得到相机内、外参,畸变系数。这个是别人的,我的导不出正确的参数,点击在线show,观看延时效果,也是异常的,抓狂。

关于参数的介绍,下面不解释了,参照上面的。下面就可以做算法,实现立体标定,使图像处在同一水平高度,水平方向,两个物体偏差是正常的,可以看下上面MATLAB导出的三维图,连个相机,一个蓝色的,一个红色的,代表不同的左右相机,拍的图片,褐色和蓝色的连个图,可以看到,垂直方向相对有点倾斜,水平方向一左一右,这是可以立体校正实现垂直方向对齐,水平方向可以通过位置偏移,来解决。将左或右图片,经过后期处理,实现x轴方向的移动覆盖,实现融合。但是如果连个相机焦距,感光钯面,成像平面分辨率,相机位置放置,清晰度有很大差异,怎么处理,都是不能很好融合的

1、相机外参

TranslationOfCamera2:相机2相对于相机1的偏移矩阵,可以直接使用。

RotationOfCamera2:相机2相对于相机1的旋转矩阵,需要转置之后才能使用。

2、相机内参

CameraParameters1与CameraParameters2为左右摄像头的单独标定参数。

CameraParameters1或CameraParameters2中包含如下文件:

IntrinsicMatrix存放的是摄像头的内参,只与摄像机的内部结构有关,需要先转置再使用。

RadialDistortion:径向畸变,摄像头由于光学透镜的特性使得成像存在着径向畸变,可由K1,K2,K3确定。

TangentialDistortion:切向畸变,由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数P1,P2确定。

使用时,需要注意参数的排放顺序,即K1,K2,P1,P2,K3。切记不可弄错,否则后续的立体匹配会出现很大的偏差。

最后总结:关于单目,双目,标定后,参数的使用方法,后面篇章再介绍。

五、第二种算法校正

MATLAB的工具箱校正出来的图像,有两个缺点,计算力大,速度慢,根据参数,采用OpenCV计算,需要消耗40ms的时间,如果是实时的视频流,是不可取的方法,第二个缺点是是导致视场角变窄,图像被往中间拉伸。

优点是,MATLAB的算法,计算出来的图像,清晰,不会出现严重的锯齿。

采用自己的写的算法,完全是三角计算,空间转换,投影的理论,强行实现遍历像素点校正,但是也慢,但是,有方法实现实时的效果,且快,实现的效果非常好,就是需要进行插值计算,锯齿严重,如图。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。