双目测距(用作双目视觉的标定图片制作)__2019.05.24

双目测距的原理:
http://blog.chinaaet.com/GreatCause/p/5100052665
http://blog.chinaaet.com/GreatCause/p/5100052690

准备:

https://blog.csdn.net/xuelabizp/article/details/50432715

虽然单双目标定的流程其实已经固定化了,但是操作的方法会影响标定的最终精度
标定是否正确可以通过TxTx      T_xTx​(左右相机光轴的距离)直接看出来
以下措施都可以提高精度:

使用高分辨率的工业相机
先单目标定,再双目标定
标定的图像中标定板要占据一半左右的面积
两台摄像机的拍照时间要尽量同步,尤其是在运动中
标定板的黑白格大一些,测量多个黑白格长度取平均值
标定的图像多一些,标定板的位姿多一些
--------------------- 
作者:moverzp 
来源:CSDN 
原文:https://blog.csdn.net/xuelabizp/article/details/50432715 
版权声明:本文为博主原创文章,转载请附上博文链接!

opencv内部也有双目标定的函数,但是结果有时候会飘,所以想先用MATLAB标定工具箱试试看。使用MATLAB先队两个相机进行单目标定,然后进行双目标定,将结果保存在xml文件中。xml文件时opencv支持的文件格式,更详细的解释可以去搜索相关资料。

https://blog.csdn.net/gao_summer_cola/article/details/78937897

opencv同时调用两个摄像头进行拍照:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cv.h>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
	VideoCapture capture, capture1;
	capture.open(0); capture1.open(1);
	// Read options
	//read_options(argc, argv, capture);
	// Init camera
	if (!capture.isOpened())
	{
		cout << "capture device 0 failed to open!" << endl;
		return 1;
	}
	if (!capture1.isOpened())
	{
		cout << "capture device 1 failed to open!" << endl;
		return 1;
	}
	// Register mouse callback to draw the tracking box
	namedWindow("right", CV_WINDOW_AUTOSIZE);
	namedWindow("left", CV_WINDOW_AUTOSIZE);
	char filename_l[15];
	char filename_r[15];
	Mat frame;
	Mat frame1;
	int i = 0;
	while (capture.read(frame) && capture1.read(frame1))
	{
		imshow("right", frame);
		imshow("left", frame1);
		if (cvWaitKey(1) == ' ') //按空格采集图像
		{
			sprintf(filename_l, "left%d.jpg", i);
			imwrite(filename_l, frame1);
			sprintf(filename_r, "right%d.jpg", i++);
			imwrite(filename_r, frame);
		}
		if (cvWaitKey(1) == 'q') { break; }
	}

	waitKey();
	return 0;
}

https://blog.csdn.net/u014731484/article/details/79378226

2.摄像头采集双目图像并且保存

标定图片需要使用标定板在不同位置、不同角度、不同姿态下拍摄,以10~20张为宜。标定板需要是黑白相间的矩形构成的棋盘图,制作精度要求较高。下面代码是使用opencv读取双目照片,进行分割之后将左右相机的的照片分别保存道相应的文件夹下。用户在使用的时候只需要修改文件夹放置的位置即可。按空格键采集一次图片。

https://blog.csdn.net/qq_30911665/article/details/72955941
需要注意的是摄像头插入的usb插口位置,在采集之前应该先打开摄像头通过遮挡一个摄像头的方式确定图像的左右和摄像头的左右是否对应
原文:https://blog.csdn.net/qq_30911665/article/details/72955941 

函数原型为:
* C++: int waitKey(int delay=0)
* Python: cv2.waitKey([delay]) → retval
* C: int cvWaitKey(int delay=0 )
* Python: cv.WaitKey(delay=0) → int
函数功能:
cvWaitKey()函数的功能是不断刷新图像,频率时间为delay,单位为ms。
返回值为当前键盘按键值。

所以显示图像时,如果需要在cvShowImage("xxxx.bmp",image)后加上while(cvWaitKey(n)==key)为大于等于0的数即可,那么程序将会停在显示函数处,不运行其他代码;直到键盘值为key的响应之后。
delay>0时,延迟"delay"ms,在显示视频时这个函数是有用的,用于设置在显示完一帧图像后程序等待"delay"ms再显示下一帧视频;如果使用cvWaitKey(0)则只会显示第一帧视频。
返回值:如果delay>0,那么超过指定时间则返回-1;如果delay=0,将没有返回值。
如果程序想响应某个按键,可利用if(cvWaitKey(1)==Keyvalue);
经常程序里面出现if( cvWaitKey(10) >= 0 ) 是说10ms中按任意键进入此if块。
注意:个函数是HighGUI中唯一能够获取和操作事件的函数,所以在一般的事件处理中,它需要周期地被调用,除非HighGUI被用在某些能够处理事件的环境中。比如在MFC环境下,这个函数不起作用。

使用打印机打印图片,注意不要选择适应边框,直接原大小打印,这样每一个小方格子的边长就是26mm(实际测量)。

测距程序:https://blog.csdn.net/mengxiang2425/article/details/82559851

 左视相机:

 内参:

 像元大小 = 5.86微米;
 焦距     = [ 4334.09568   4334.09568 ](像素);
 主点坐标 = [ 959.50000   511.50000 ]  (像素);

 相对于虚拟焦平面的外参:

 旋转向量 = [ 0.04345   -0.05236  -0.01810 ];
 平移向量 = [ -518.97666   01.20629  9.14632 ](毫米)
 右视相机:

 内参:

 像元大小 = 5.86微米;
 焦距     = [ 4489.55770   4507.13412 ](像素);
 主点坐标 = [ 801.86552   530.72579 ]  (像素);

 相对于虚拟焦平面的外参:

 旋转向量 = [ 0.04345   -0.05236  -0.01810 ];
 平移向量 = [ 518.97666   -01.20629  -9.14632 ](毫米)

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值