OpenCV三种立体匹配求视差图算法总结
2016-11-18 09:03
477 查看
首先我们看一下BM算法:
该算法代码:
CvStereoBMState *BMState = cvCreateStereoBMState();
int SADWindowSize=15;
BMState->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 9;
BMState->minDisparity = 0;
BMState->numberOfDisparities = 32;
BMState->textureThreshold = 10;
BMState->uniquenessRatio = 15;
BMState->speckleWindowSize = 100;
BMState->speckleRange = 32;
BMState->disp12MaxDiff = 1;
cvFindStereoCorrespondenceBM( left, right, left_disp_,BMState);
cvNormalize( left_disp_, left_vdisp, 0, 256, CV_MINMAX );
其中minDisparity是控制匹配搜索的第一个参数,代表了匹配搜苏从哪里开始,numberOfDisparities表示最大搜索视差数uniquenessRatio表示匹配功能函数,这三个参数比较重要,可以根据实验给予参数值。
该方法速度最快,一副320*240的灰度图匹配时间为31ms,视差图如下。
第二种方法是SGBM方法这是OpenCV的一种新算法:
各参数设置如BM方法,速度比较快,320*240的灰度图匹配时间为78ms,视差效果如下图。
第三种为GC方法:
该方法速度超慢,但效果超好。
该算法代码:
CvStereoBMState *BMState = cvCreateStereoBMState();
int SADWindowSize=15;
BMState->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 9;
BMState->minDisparity = 0;
BMState->numberOfDisparities = 32;
BMState->textureThreshold = 10;
BMState->uniquenessRatio = 15;
BMState->speckleWindowSize = 100;
BMState->speckleRange = 32;
BMState->disp12MaxDiff = 1;
cvFindStereoCorrespondenceBM( left, right, left_disp_,BMState);
cvNormalize( left_disp_, left_vdisp, 0, 256, CV_MINMAX );
其中minDisparity是控制匹配搜索的第一个参数,代表了匹配搜苏从哪里开始,numberOfDisparities表示最大搜索视差数uniquenessRatio表示匹配功能函数,这三个参数比较重要,可以根据实验给予参数值。
该方法速度最快,一副320*240的灰度图匹配时间为31ms,视差图如下。
第二种方法是SGBM方法这是OpenCV的一种新算法:
cv::StereoSGBM sgbm; sgbm.preFilterCap = 63; int SADWindowSize=11; int cn = 1; sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3; sgbm.P1 = 4*cn*sgbm.SADWindowSize*sgbm.SADWindowSize; sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize; sgbm.minDisparity = 0; sgbm.numberOfDisparities = 32; sgbm.uniquenessRatio = 10; sgbm.speckleWindowSize = 100; sgbm.speckleRange = 32; sgbm.disp12MaxDiff = 1; sgbm(left , right , left_disp_); sgbm(right, left , right_disp_);
各参数设置如BM方法,速度比较快,320*240的灰度图匹配时间为78ms,视差效果如下图。
第三种为GC方法:
CvStereoGCState* state = cvCreateStereoGCState( 16, 2 ); left_disp_ =cvCreateMat( left->height,left->width, CV_32F ); right_disp_ =cvCreateMat( right->height,right->width,CV_32F ); cvFindStereoCorrespondenceGC( left, right, left_disp_, right_disp_, state, 0 ); cvReleaseStereoGCState( &state );
该方法速度超慢,但效果超好。
相关文章推荐
- OpenCV三种立体匹配求视差图算法总结
- OpenCV三种立体匹配求视差图算法总结
- OpenCV三种立体匹配求视差图算法总结
- OpenCV三种立体匹配求视差图算法总结
- OpenCV三种立体匹配求视差图算法总结
- OpenCV三种立体匹配求视差图算法总结
- OpenCV三种立体匹配求视差图算法总结
- Opencv中三种立体匹配算法的比较
- OpenCv中实现了三种立体匹配算法:
- OpenCV学习笔记(18)双目测距与三维重建的OpenCV实现问题集锦(三)立体匹配与视差计算
- OpenCV学习笔记(18)双目测距与三维重建的OpenCV实现问题集锦(三)立体匹配与视差计算
- OpenCV3.0立体匹配算法对比研究(SGBM、BM、GC)
- 立体匹配算法(Stereo Matching)及其在OpenCV中的应用
- OpenCV学习笔记(18)双目测距与三维重建的OpenCV实现问题集锦(三)立体匹配与视差计算
- 基于Opencv的几种立体匹配算法+ELAS
- SAD立体匹配算法在opencv中的实现
- SAD立体匹配算法在opencv中的实现
- 【OpenCV】立体匹配算法 StereoBM/StereoSGBM/StereoVar
- 【视觉=立体视觉】立体匹配算法 StereoBM/StereoSGBM/StereoVar(OpenCV中源码分析)+SAD块匹配算法+GC算法+HH算法
- 立体匹配:关于OpenCV读写middlebury网站的给定的视差并恢复三维场景的代码