相关文章推荐
成熟的柳树  ·  Spring - ...·  2 月前    · 

因为项目采用PNP测距,需要知道工业相机的内参矩阵和畸变矩阵,所以采用MATLAB自带的标定应用CameraCalibrator进行标定工业相机(以迈德威视相机为例)。
请添加图片描述

原理及操作可结合以下博客:

OpenCV 相机标定 (Python版)

1、电脑上装好matlab。
2、普通无驱USB相机直接用,工业相机需要装SDK驱动,因为标定的时候需要拍照。
3、标准标定板-棋盘格图片,标定的时候保证平整,

请下载正规标定板PDF,以下仅为演示图片:
在这里插入图片描述

三、拍标定图

以下两点非常重要!!!!!!

1、标定拍的照片尺寸一定要与实际工程处理图像尺寸一样,不然利用参数矩阵进行测距会完全错误,具体方法是在图像采集前resize一下。
2、标定格最好占整个画面的三分之二,而且视角多元化。

采集镜头各个角度大概 15~20 张图片,我一般是上下左右左上左下右上右下各两张一共16张-20张。

采集图像代码如下:以迈德威视SDK为例,拍照前把鼠标指针对着视频流点一下,按Z进行拍照:
在这里插入图片描述

cv::Mat matImage(
					cvSize(sFrameInfo.iWidth,sFrameInfo.iHeight), 
					sFrameInfo.uiMediaType == CAMERA_MEDIA_TYPE_MONO8 ? CV_8UC1 : CV_8UC3,
					m_pFrameBuffer
				resize(matImage, matImage, Size(640, 512));
				imshow(g_CameraName, matImage);
				int a = waitKey(2);
				if (a == 'z' || a == 'Z')
					sprintf(cstr, "%d%s", num++, ".jpg");
					imwrite(cstr, matImage);
					printf("已保存图片!\n");

1、点击CameraCalibrator或者在MATLAB的命令行窗口输入 cameraCalibrator 打开标定工具。
在这里插入图片描述
在这里插入图片描述

2、点击Add Images选择拍棋盘格的路径,把拍的都包含进去,点打开。
在这里插入图片描述
3、填写方格纸中黑色小格的边长,我的标定纸格子边长不到25mm,大概是24.5mm,点击确定。
在这里插入图片描述
4、此时会出现处理好的图片如下
在这里插入图片描述
5、上面的Options里设置如下(使用两参数,选择错切和桶形畸变),设置好后点击Calibrate
在这里插入图片描述
6、标定完成,右边总平均误差小于0.5即可,右下方显示拍摄视角和距离。点击Export Camera Parameters导出标定结果。
在这里插入图片描述

五、数据处理并应用于PNP测距

数据导出后,双击工作区的值,只需要注意这四行结果。
在这里插入图片描述
第一行ImageSize是图像大小。
第二行RadialDistortion是径向畸变k1,k2,k3=0。
第三行TangentialDistortion是切向畸变p1,p2。
第四行IntrinsicMatrix为相机内参的3×3转置矩阵
在这里插入图片描述

应用于PNP测距中相机参数设定:

    cameraMatrix = Mat::eye(3, 3, CV_64F);                      //相机内参
	cameraMatrix.at<double>(0, 0) = 3.020093800002726e+03;
	cameraMatrix.at<double>(0, 1) = 3.908106555724952;
	cameraMatrix.at<double>(0, 2) = 6.251778697785120e+02;
	cameraMatrix.at<double>(1, 1) = 3.028534518793932e+03;
	cameraMatrix.at<double>(1, 2) = 5.777494389750183e+02;
	distCoeffs = Mat::zeros(5, 1, CV_64F);                       //相机畸变
	distCoeffs.at<double>(0, 0) = 0.106919541349743;             //k1
	distCoeffs.at<double>(1, 0) = 2.058323550640524;             //k2
	distCoeffs.at<double>(2, 0) = 0.008357212337159;             //p1
	distCoeffs.at<double>(3, 0) = 0.004352178235639;             //p2
	distCoeffs.at<double>(4, 0) = 0;                             //k3

solvePnP函数:
在这里插入图片描述
注意!!!!!!!

世界坐标选取要与目标点选取顺序一 一对应,不然测距错误。

关于测距方面,后续会另出博客讲述如何应用于实际工程。

参考:
OpenCV 相机标定 (Python版)

关于PNP具体原理:
3D-2D:PnP算法原理
具体书籍:《视觉SLAM十四讲》

pw3=zeros(n,3);%物体坐标3维 pc2=zeros(n,2);%成像坐标2维 pw3=[-1000,-100,0;1000,-100,0;-1000,100,0;-1000,100,0]; pc2=[-67.8995,-56.3607;83.138,43.324;73.6759,61.1555;-75.8558,-39.52 x = zeros(15, 2); K=[25 0 0;0 25 0;0 0 1;]%相机内参数矩阵 R=[0.4770710827172032, -0.7476726229304006, -0.4619402893831741;%旋转矩阵 0.653281340399395, 0.653280157390419, -0.38
单目相机测距 单目测距的小项目,大概需要就是用单目相机,对一个特定的目标进行识别并测算相机与该目标的距离。所以便去网上找了一堆教程,这里给大家总结一下,希望给小白们一个参考。 首先是基本需求了 opencv自然要会的,这咱就不多说了,会一点就行 需要一个摄像头,我用的是一个畸变很大的鱼眼免驱动摄像头,大家用电脑上的那个自带摄像头也可以的,就是不方便。 · 需要MATLAB进行相...
我们在之前完成了对rect的提取,工业相机的使用,那么接下来就可以测距了,本文章利用相似三角形来进行测距,然后下一篇文章会用到pnp测距,那么现在开始! 相信大家在初中应该都学习过相似三角形,那么具体应用之前,我们得先知道小孔成像的一些事情,我们使用的相机是针孔相机,然后可以看下下面这个图 然后的话就是公式的应用:f/d = h1/h2 /******************************************************************* 本文将不再涉及原理部分,想要了解基础知识的话,请看上一篇的文章,我们使用的是opencv的里面的函数,这里面也是重点看这个函数们,我们通过这个函数来得到外参,在通过外参来得到我们最后的结果! Opencv:SolvePNP 参考:https://www.jianshu.com/p/b97406d8833c 简介:如果场景的三维结构已知,利用多个控制点在三维场景中的坐标及其在图像中的透视投影坐标即可求解出摄像机坐标系与表示三维场景结构的世界坐标系之间的绝对位姿关系,包括绝对平移向量t以及旋转矩阵R,该