赞
踩
双目测距的操作流程有四步:相机标定——双目校正——双目匹配——计算深度,具体内容参考 : https://blog.csdn.net/qq_38236355/article/details/88933839
其中相机标定通常用matlab现成的工具箱进行标定,具体操作参考: https://blog.csdn.net/qq_38236355/article/details/89280633
我们接下来在完成相机标定的基础上,用标定得到的数据,按上述流程对双目深度进行计算。如果用的是任意的两个单目摄像头拼成的双目相机,则需要按上述所说进行双目校正;如果用的是成品的双目相机,则不需要进行双目校正,商家已经对相机校正好了。
一、双目校正+BM算法双目匹配生成视差图+生成深度图
#include <opencv2\opencv.hpp> #include <iostream> using namespace std; using namespace cv; const int imagewidth = 752; const int imageheigh = 480; // 摄像头分辨率752*480 Size imageSize = Size(imagewidth, imageheigh); Mat grayImageL; Mat grayImageR; Mat rectifyImageL, rectifyImageR; Mat disp, disp8;//视差图 Rect vaildROIL; Rect vaildROIR;//图像校正后,会对图像进行裁剪,这里的vaildROIR就是指裁剪之后的区域 Mat maplx, maply, mapRx, mapRy;//映射表 Mat Rl, Rr, Pl, Pr, Q; //校正旋转矩阵R,投影矩阵P,重投影矩阵Q Mat xyz; int blockSize = 0, uniquenessRatio = 0, numDisparities = 0; Ptr<StereoBM>bm = StereoBM::create(16, 9); //事先用matlab标定好的相机参数 //matlab里的左相机标定参数矩阵 Mat cameraMatrixL = (Mat_<float>(3, 3) << 165.9419, -0.2471, 372.8349, 0, 164.8281, 325.8182, 0, 0, 1); //matlab里左相机畸变参数 Mat distCoeffL = (Mat_<double>(5, 1) << -0.0218, -0.0014, -0.0104, -0.0025, -0.000024286); //matlab右相机标定矩阵 Mat cameraMatrixR = (Mat_<double>(3, 3) << 168.2781, 0.1610, 413.2010, 0, 167.7710, 304.7487, 0, 0, 1); //matlab右相机畸变参数 Mat distCoffR = (Mat_<double>(5, 1) << -0.0332, 0.0033, -0.0090, -0.0029, -0.00038324); //matlab T 平移参数 Mat T = (Mat_<double>(3, 1) << -117.2789, -0.8970, 0.9281); //旋转矩阵 Mat R = (Mat_<double>(3, 3) << 1.0000, -0.0040, -0.000052, 0.0040, 1.0000, -0.0041, 0.0000683, 0.0041, 1.0000); //立体匹配 BM算法 void stereo_match(int, void*) { bm->setBlockSize(2 * blockSize + 5);//SAD窗口大小 bm->setROI1(vaildROIL); bm->setROI2(vaildROIR); bm->setPreFilterCap(31); bm->setMinDisparity(0);//最小视差,默认值为0 bm->setNumDisparities(numDisparities * 16 + 16);//视差窗口&#x
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。