OpenCv中实现了三种立体匹配算法:
OpenCv中实现了三种立体匹配算法:
BM算法
SGBM算法 Stereo Processing by Semiglobal Matching and Mutual Information
GC算法 算法文献:Realistic CG Stereo Image Dataset with Ground Truth Disparity Maps
参考:http://blog.csdn.net/wqvbjhc/article/details/6260844
BM算法:速度很快,效果一般
复制代码
void BM()
{
IplImage * img1 = cvLoadImage("left.png",0);
IplImage * img2 = cvLoadImage("right.png",0);
CvStereoBMState* BMState=cvCreateStereoBMState();
assert(BMState);
BMState->preFilterSize=9;
BMState->preFilterCap=31;
BMState->SADWindowSize=15;
BMState->minDisparity=0;
BMState->numberOfDisparities=64;
BMState->textureThreshold=10;
BMState->uniquenessRatio=15;
BMState->speckleWindowSize=100;
BMState->speckleRange=32;
BMState->disp12MaxDiff=1;
CvMat* disp=cvCreateMat(img1->height,img1->width,CV_16S);
CvMat* vdisp=cvCreateMat(img1->height,img1->width,CV_8U);
int64 t=getTickCount();
cvFindStereoCorrespondenceBM(img1,img2,disp,BMState);
t=getTickCount()-t;
cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
cvSave("disp.xml",disp);
cvNormalize(disp,vdisp,0,255,CV_MINMAX);
cvNamedWindow("BM_disparity",0);
cvShowImage("BM_disparity",vdisp);
cvWaitKey(0);
//cvSaveImage("cones\\BM_disparity.png",vdisp);
cvReleaseMat(&disp);
cvReleaseMat(&vdisp);
cvDestroyWindow("BM_disparity");
}
复制代码
left.png right.png disparity.jpg
SGBM算法,作为一种全局匹配算法,立体匹配的效果明显好于局部匹配算法,但是同时复杂度上也要远远大于局部匹配算法。算法主要是参考Stereo Processing by Semiglobal Matching and Mutual Information。
opencv中实现的SGBM算法计算匹配代价没有按照原始论文的互信息作为代价,而是按照块匹配的代价。
参考:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=23854
复制代码
#include <highgui.h>
#include <cv.h>
#include <cxcore.h>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
IplImage * img1 = cvLoadImage("left.png",0);
IplImage * img2 = cvLoadImage("right.png",0);
cv::StereoSGBM sgbm;
int SADWindowSize = 9;
sgbm.preFilterCap = 63;
sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3;
int cn = img1->nChannels;
int numberOfDisparities=64;
sgbm.P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
sgbm.minDisparity = 0;
sgbm.numberOfDisparities = numberOfDisparities;
sgbm.uniquenessRatio = 10;
sgbm.speckleWindowSize = 100;
sgbm.speckleRange = 32;
sgbm.disp12MaxDiff = 1;
Mat disp, disp8;
int64 t = getTickCount();
sgbm((Mat)img1, (Mat)img2, disp);
t = getTickCount() - t;
cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
disp.convertTo(disp8, CV_8U, 255/(numberOfDisparities*16.));
namedWindow("left", 1);
cvShowImage("left", img1);
namedWindow("right", 1);
cvShowImage("right", img2);
namedWindow("disparity", 1);
imshow("disparity", disp8);
waitKey();
imwrite("sgbm_disparity.png", disp8);
cvDestroyAllWindows();
return 0;
}
复制代码
left.png right.png disparity.jpg
GC算法 效果最好,速度最慢
复制代码
void GC()
{
IplImage * img1 = cvLoadImage("left.png",0);
IplImage * img2 = cvLoadImage("right.png",0);
CvStereoGCState* GCState=cvCreateStereoGCState(64,3);
assert(GCState);
cout<<"start matching using GC"<<endl;
CvMat* gcdispleft=cvCreateMat(img1->height,img1->width,CV_16S);
CvMat* gcdispright=cvCreateMat(img2->height,img2->width,CV_16S);
CvMat* gcvdisp=cvCreateMat(img1->height,img1->width,CV_8U);
int64 t=getTickCount();
cvFindStereoCorrespondenceGC(img1,img2,gcdispleft,gcdispright,GCState);
t=getTickCount()-t;
cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
//cvNormalize(gcdispleft,gcvdisp,0,255,CV_MINMAX);
//cvSaveImage("GC_left_disparity.png",gcvdisp);
cvNormalize(gcdispright,gcvdisp,0,255,CV_MINMAX);
cvSaveImage("GC_right_disparity.png",gcvdisp);
cvNamedWindow("GC_disparity",0);
cvShowImage("GC_disparity",gcvdisp);
cvWaitKey(0);
cvReleaseMat(&gcdispleft);
cvReleaseMat(&gcdispright);
cvReleaseMat(&gcvdisp);
}
复制代码
left.png right.png disparity.jpg
如何设置BM、SGBM和GC算法的状态参数?
参看:http://blog.csdn.net/chenyusiyuan/article/details/5967291
OpenCv中实现了三种立体匹配算法:相关推荐
- OpenCV精进之路(零):访问图像中像素的三种方法
访问像素的三种方法 指针访问:最快 迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 这里 ...
- 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合
1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...
- 双目视觉(三)立体匹配算法
系列文章: 双目视觉(一)双目视觉系统 双目视觉(二)双目匹配的困难和评判标准 双目视觉(三)立体匹配算法 双目视觉(四)匹配代价 双目视觉(五)立体匹配算法之动态规划全局匹配 双目视觉(六)U-V视 ...
- python 立体匹配算法_OpenCV3.4两种立体匹配算法效果对比
以OpenCV自带的Aloe图像对为例: 1.BM算法(Block Matching) 参数设置如下: int numberOfDisparities = ((imgSize.width / 8) + ...
- C++使用命名空间中成员的三种方式
通过简单的代码来介绍使用命名空间中成员的三种方式(我们最常用到的命名空间是是标准库std,下面的命名空间都以std为例): 使用作用域符:: 1 #include<iostream> 2 ...
- 计算机网络技术及应用 课程 英语,计算机网络应用—现代英语课堂中的第三种语言...
陶 兰 摘 要 众所周知,传统的课堂教学包括了教师教学语言及教师体态语言.前者指教师为了灌输知识用自己的声音所进行的表达和与学生的交流;后者指教师为了达到教学目的而有意做出的表情.动作和姿势的总和.随 ...
- js基础语法(01)-JS中+号的三种含义
01-JS中+号的三种含义 (1)数学意义上的相加 : 1 + 1 会得到: 2 (2) 数学意义上的正负号: +5 正数 作用:可以把string类型转换成number类型 (3)字符串的连接符:' ...
- Class java用法,java中Class的三种实例化
1.调用Object类中的getClass()方法:import java.util.Date; public class ReflectTest3 { public static void main ...
- python的命名空间_python中命名空间的三种方式介绍(附示例)
本篇文章给大家带来的内容是关于python中命名空间的三种方式介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. python中的命名空间分三种: 内置的命名空间,在启动解 ...
最新文章
- GO程序调用C及C++库的实现方式
- 13.3的MacBook air 8g内存还是有点吃力
- servlet的一些简单理解
- XtraGrid RepositoryItemCheckEdit 显示状态以及单选多选问题
- [Java基础]Stream流的常见生成方式
- wince6.0 s5pv210 中断
- Signal处理中的函数可重入问题
- 如何修改WAMP中mysql默认空密码重新登录phpmyadmin
- JavaScript语言精粹--执行环境及作用域,this
- 前端新手入门必读!前端开发线路图分享
- zabbix 之 配置iptables允许10050端口
- [转载] 【RTTmicropython教程】玩转 Web 服务器
- 特性Attibute定义和使用
- 软件加入使用时间_2020年,加入“midi音乐制作讲堂”内部会员,学音乐制作变得更简单...
- BOS物流项目02———创建项目
- 对话惠普亚太区高管:绿色智慧的中国战略
- 手撕力扣之贪心法:买卖股票的最佳时机 II、最大子序和、跳跃游戏、跳跃游戏 II、分发饼干、划分字母区间、重构字符串、分发糖果、种花问题、加油站
- baidu 地图 3d版 自定义地图样式
- jetson nano图形界面自动登录(lxde桌面自动登录)
- 应用计算机怎么弹ink,Win10不小心按W键结果弹出INK工作区的处理方法
热门文章
- 在MATLAB和OpenCV环境下写的灰度图像分段线性变换源码
- fs_struct和file_struct关系
- leetcode算法题--最低票价★
- leetcode算法题--划分为k个相等的子集★
- leetcode算法题--扁平化嵌套列表迭代器
- leetcode算法题--二叉树的锯齿型层次遍历
- excel另存为没有dbf_PDF转Excel怎么做的?节省工作时间,你要学会的办公技巧
- android动态加载宽高,动态添加LinearLayout的高度实例
- 区分 UML 类图中的几种关系
- “第三届中国行业互联网大会暨CIO班12周年年会”成功举行