基于VS2015和opencv3.1的双目测距

基于VS2015和opencv3.1的双目测距

  • 1. 环境配置过程:
  • 2.单双目摄像头标定
    • 2.1 单目摄像头标定
      • 2.1.1 单目拍照
      • 2.1.2 使用calib工具箱标定

1. 环境配置过程:

这方面可以参考的博客很多,本人也曾写过配置教程,如果只是进行双目测距则不需要安装opencv_contrib。具体安装过程不进行展开介绍。

2.单双目摄像头标定

2.1 单目摄像头标定

2.1.1 单目拍照

相机标定的目的是利用内参和外参建立三维世界到相机成像平面的几何模型,并计算畸变系数从而矫正透镜制造工艺带来的畸变。目前最常用的标定法为张氏标定法。该方法采用二维的平面棋盘来完成标定。由于二维物体相对三维物体会缺少部分信息,因此要多次改变棋盘方位以获得更丰富的坐标信息。OpenCV自带了相机的标定函数文件calibration.cpp。但是经过测试,该函数在角点的识别方面非常的不灵敏。MATLAB的标定工具箱cameraCalibration可以在完成标定实现对添加的棋盘格图片自动搜索角点,其准确度和灵敏度都很高。因此标定部分采用MATLAB标定工具箱完成。
首先将工具箱解压在toolbox文件夹下,并添加文件夹calib的位置到matlab路径path中,具体操作为:File->Set Path->Add Folder To Path,然后找到刚刚存放的文件夹并保存,配置结束。
我们在对单目摄像机进行标定的时候,一般至少要拍20张照片才能满足精度要求,在拍照的过程中,图片的命名要设定为类似rightxx.jpg的形式,因为在calib工具箱读入的时候,可以直接读入,如果不小心搞错了想我一样设置成了the xx pic.jpg,也没关系,正好可以学习如何用Excel批处理改文件名;
拍照代码如下:

//20190113
//take 20 pictures by left camera
//save pictures in the folder

#include
#include
using namespace cv;
int main()
{
	namedWindow("camera01", WINDOW_AUTOSIZE);
	VideoCapture capture0;
	Mat camera0;
	unsigned int num = 0;

	capture0.open(1);
	if (!capture0.isOpened())
		return 0;
	while (camera0.empty() == 1)
		capture0.read(camera0);
	for (int i = 1; i < 100; i++)
		capture0.read(camera0);
	while (num != 20)
	{
		num++;
		waitKey(500);
		capture0.read(camera0);
		imwrite("f:\\rightpics\\right" + std::to_string(num) + ".jpg", camera0);
	}
	return 0;
}

拍照之后的效果如图所示,建议角度更大一些,这样计算得出的单应性矩阵效果更好。
基于VS2015和opencv3.1的双目测距_第1张图片

2.1.2 使用calib工具箱标定

在Matlab命令行窗口中输入calib_gui,出现对话框,选择standard之后如图:
基于VS2015和opencv3.1的双目测距_第2张图片
此时将matlab的路径设置在我们刚刚拍照存储的文件夹下:rightpics;
点击Image names,命令行窗口会提示你输入图片的basename以及图片的格式(比如你图片文件名是right01, right02, …, right12,basename就是right,图片格式如:jpg),然后Matlab会自动帮你读入这些图片,操作和效果如图所示:
基于VS2015和opencv3.1的双目测距_第3张图片
然后再回到主控制界面,点击Extract grid corners,提取每幅图的角点。点击完后,命令行会出现提示,这些选项,都只要敲回车选用默认设置就可以了,默认值代表的含义都写的很清楚。
当我们一路回车下去之后,20张图片会以此跳出,按顺时针或者逆时针方向分别点选棋盘格的最外面的四个内格点,程序会自动检测出其余的角点。

你可能感兴趣的:(毕设,opencv)