OpenCV三种立体匹配求视差图算法总结
2016-01-27 17:46
483 查看
【原文:http://blog.csdn.net/mailang2008/article/details/5873883】
对OpenCV中涉及的三种立体匹配算法进行代码及各自优缺点总结:
首先我们看一下BM算法:
该算法代码:
[cpp] view
plaincopy
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的一种新算法:
[cpp] view
plaincopy
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方法:
[cpp] view
plaincopy
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中涉及的三种立体匹配算法进行代码及各自优缺点总结:
首先我们看一下BM算法:
该算法代码:
[cpp] view
plaincopy
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的一种新算法:
[cpp] view
plaincopy
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方法:
[cpp] view
plaincopy
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 );
该方法速度超慢,但效果超好。
各方法理论可以参考文献。
相关文章推荐
- [Apache Kafka]Kafka运维
- Centos 6.5下以RPM方式安装MySQL5.6.16(详细版)
- centos yum 安装mongo
- Hadoop中的一些基本操作
- 基于apache的tomcat负载均衡与集群
- 【Linxu学习001】Linux常用命令
- Previous operation has not finished; run 'cleanup' if it was interrupted svn错误
- 总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站
- Sqoop安装
- 总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站
- hadoop、hbase、hive、zookeeper版本对应关系
- linux(4) vi编辑/删除、复制、粘贴 /bash shell 环境变量设置/数据流重定向 | 的用法
- 5.3 Components — Passing Properties to A Component
- 珍藏多年的素材,灵感搜寻网站
- 【Hadoop】HDFS的运行原理
- linux能搭建maven仓库
- Hadoop参数优化整理
- hadoop 处理小文件 方式TBD
- 获取出口IP的网站
- Linux第三天03