双目匹配过程记录
来源:互联网 发布:广东省社会科学院知乎 编辑:程序博客网 时间:2024/04/29 02:31
此文章参考如下博客:
http://blog.csdn.net/wangchao7281/article/details/52506691
感谢子非鱼大大提供的宝贵的理论知识和代码。
双目匹配的过程无非是包括双目相机的标定、矫正以及最后得出视差图这么几个步骤。具体的理论知识可以参考上文的博客地址中的讲述或者自行搜索。
1. 双目相机的标定
双目相机的标定我使用的是Matlab的APP,Matlab自带Stereo Camera Calibration工具,位置如下截图
点击下拉按钮,在图像处理和计算机视觉中找到Stereo Camera Calibration模块并打开它,点击Add images按钮,分别把左右相机拍摄的图片传入Matlab中,其中的Size of checkerboard square的大小是标定板的方格的长度,单位是mm。
之后Matlab就会自动识别角点,点击上方菜单栏的Calibrate就会自动计算相关的参数,点击Export Camera Parameters之后就会把相关的参数Matlab的工作区,在这里就可以查看相关的参数了。
红色方框圈起来的是左右相机的各种参数,点进去之后可以看到相机的内参数以及畸变参数等等,红色箭头指向的是旋转矩阵,蓝色箭头指向的是平移矩阵。
至此标定部分全部完成,具体的参数可以直接在Matlab的工作区中查看即可。
2. 双目相机的矫正
在步骤1中,我们通过标定得到了相机的各种参数,现在把它传入OpenCV。代码如下
Mat cameraMatrixL = (Mat_<double>(3, 3) << 1.289608025726931e+03, 0, 6.437248258682027e+02, 0, 1.290358173802592e+03, 5.321046969048958e+02, 0, 0, 1);Mat distCoeffL = (Mat_<double>(5, 1) << -0.447270756264546, 0.248847254828889, 0, 0, 0.00000);Mat cameraMatrixR = (Mat_<double>(3, 3) << 1.289350232644886e+03, 0, 6.443163387389753e+02, 0, 1.289962540201652e+03, 5.284409180695891e+02, 0, 0, 1);Mat distCoeffR = (Mat_<double>(5, 1) << -0.444499341518694, 0.234760627512454, 0, 0, 0.00000);Mat T = (Mat_<double>(3, 1) << -2.383757790772444e+02, 2.938085768248284, -1.249386542211461);//T平移向量Mat R = (Mat_<double>(3, 3) << 0.999188845533377, 0.013112400390036, -0.038075135163100, -0.012563847364096, 0.999814319377252, 0.014610835281208, 0.038259648470532, -0.014120613450352, 0.999168057723373);//R 旋转矩阵
这样,左右两个相机的内参数以及畸变参数已经传入到OpenCV,下面就可以进行矫正了。
//校正 stereoRectify(cameraMatrixL, distCoeffL, cameraMatrixR, distCoeffR, imageSize, R, T, Rl, Rr, Pl, Pr, Q, CALIB_ZERO_DISPARITY, 0, imageSize, &validROIL, &validROIR); initUndistortRectifyMap(cameraMatrixL, distCoeffL, Rl, Pr, imageSize, CV_32FC1, mapLx, mapLy); initUndistortRectifyMap(cameraMatrixR, distCoeffR, Rr, Pr, imageSize, CV_32FC1, mapRx, mapRy);//读取需要矫正的图片,矫正的图片只能是灰色图 rgbImageL = imread("left24.png", CV_LOAD_IMAGE_COLOR); cvtColor(rgbImageL, grayImageL, CV_BGR2GRAY); rgbImageR = imread("right24.png", CV_LOAD_IMAGE_COLOR); cvtColor(rgbImageR, grayImageR, CV_BGR2GRAY); namedWindow("ImageL Before Rectify", 0); namedWindow("ImageR Before Rectify", 0); imshow("ImageL Before Rectify", grayImageL); imshow("ImageR Before Rectify", grayImageR);//矫正 remap(grayImageL, rectifyImageL, mapLx, mapLy, INTER_LINEAR); remap(grayImageR, rectifyImageR, mapRx, mapRy, INTER_LINEAR); Mat rgbRectifyImageL, rgbRectifyImageR; cvtColor(rectifyImageL, rgbRectifyImageL, CV_GRAY2BGR); //伪彩色图 cvtColor(rectifyImageR, rgbRectifyImageR, CV_GRAY2BGR); namedWindow("ImageL After Rectify", 0); namedWindow("ImageR After Rectify", 0); imshow("ImageL After Rectify", rgbRectifyImageL); imshow("ImageR After Rectify", rgbRectifyImageR);
3. 双目的匹配
经过步骤1和步骤2之后,双目匹配的实验也已经完成了大部分的工作,最后一步的匹配则就简单得多了,可以选择适合自己的匹配算法来完成立体匹配的结果,这里我选用的是OpenCV自带的SGBM算法。
int blockSize = 0, uniquenessRatio = 0, numDisparities = 0;Ptr<StereoSGBM> sgbm = StereoSGBM::create(0, 16, 3);void stereo_match(int, void*){ int SADWindowSize = 5; sgbm->setPreFilterCap(63); int sgbmWinSize = SADWindowSize > 0 ? SADWindowSize : 3; sgbm->setBlockSize(sgbmWinSize); int cn = rgbImageL.channels(); sgbm->setP1(8 * cn*sgbmWinSize*sgbmWinSize); sgbm->setP2(32 * cn*sgbmWinSize*sgbmWinSize); sgbm->setMinDisparity(0); numberOfDisparities = numberOfDisparities > 0 ? numberOfDisparities : ((imageSize.width / 8) + 15) & -16; sgbm->setNumDisparities(numberOfDisparities); sgbm->setUniquenessRatio(10); sgbm->setSpeckleWindowSize(100); sgbm->setSpeckleRange(32); sgbm->setDisp12MaxDiff(1); sgbm->setMode(StereoSGBM::MODE_SGBM_3WAY); Mat disp, disp8; sgbm->compute(rectifyImageL, rectifyImageR, disp); disp.convertTo(disp8, CV_8U, 255 / (numberOfDisparities *16.)); imwrite("disp.png", disp8); imshow("disp8", disp8);}
匹配的算法有很多种,OpenCV自带的有BM,SGBM,GC,HH等等。
4. 结束语
对于双目匹配的相关的东西,我也是刚刚接触不到半个月,深感这个东西网上的资料很繁杂,且大多数资料不给出具体的步骤,理论的东西过多,亦或是版本过于陈旧。本篇文章如有问题,可以留言或者私信我,我很乐意探讨相关的问题。
- 双目匹配过程记录
- 双目立体匹配 SAD
- 双目立体匹配 Census
- 双目立体匹配回顾笔记
- 双目匹配与视差计算
- 双目匹配与视差计算
- 【opencv】双目匹配代码分析
- 双目视觉---立体匹配介绍
- 双目匹配与视差计算
- 【立体视觉】双目图像匹配
- 【OpenCV】双目测距(双目标定、双目校正和立体匹配)
- 【OpenCV】双目测距(双目标定、双目校正和立体匹配)
- 【OpenCV】双目测距(双目标定、双目校正和立体匹配)
- 【OpenCV】双目测距(双目标定、双目校正和立体匹配)
- 【OpenCV】双目测距(双目标定、双目校正和立体匹配)
- 双目视觉——立体匹配基本理论
- 双目视觉测量的,极线匹配
- 双目立体视觉SAD匹配算法
- 华为软件开发云CloudIDE功能简测
- python pandas.errors Buffer overflow caught
- 使用 NTP 解决 Ceph 集群的时钟偏移
- 动态规划
- Hdu6078Wavel Sequence
- 双目匹配过程记录
- SSL协议握手过程
- 设计模式初探-桥接模式
- 集合
- Hibernate中使用@Temporal修饰日期类型的属性
- SEO(搜索引擎优化)百度鼓励原创,那么如何判断呢,百度原创识别“起源”算法与星火计划
- Python3+OpenCV人脸识别
- 域名解析到本地主机
- combineByKey算子求解平均值实例