同http://blog.csdn.net/chuhang_zhqr/article/details/51179881类似,采用


这两个经典的图片进行测试。

关于BM和SGBM以及VAR的参数设置请参考
晨宇思远

本文代码基于opencv2.4.9
本文源码地址在我的CSDN代码资源:
http://download.csdn.net/detail/chuhang_zhqr/9703763

0:ELAS
这里要去下载Elas的开源库函数。

int StereoMatch::ElasMatch()
{
    cv::Mat disp_l,disp_r,disp8u_l,disp8u_r;double minVal; double maxVal; //视差图的极值    cv::Mat leftImage = cv::imread("../test_images/leftr31.png",0);
    cv::Mat rightImage = cv::imread("../test_images/rightr31.png",0);// 计算视差// generate disparity image using LIBELASint bd = 0;const int32_t dims[3] = {leftImage.cols,leftImage.rows,leftImage.cols};
    cv::Mat leftdpf = cv::Mat::zeros(cv::Size(leftImage.cols,leftImage.rows), CV_32F);
    cv::Mat rightdpf = cv::Mat::zeros(cv::Size(leftImage.cols,leftImage.rows), CV_32F);
    Elas::parameters param;param.postprocess_only_left = false;Elas elas(param);elas.process(leftImage.data,rightImage.data,leftdpf.ptr<float>(0),rightdpf.ptr<float>(0),dims);    cv::Mat(leftdpf(cv::Rect(bd,0,leftImage.cols,leftImage.rows))).copyTo(disp_l);
    cv::Mat(rightdpf(cv::Rect(bd,0,rightImage.cols,rightImage.rows))).copyTo(disp_r);//-- Check its extreme values
    cv::minMaxLoc( disp_l, &minVal, &maxVal );cout<<"Min disp: Max value"<< minVal<<maxVal; //numberOfDisparities.= (maxVal - minVal)//-- Display it as a CV_8UC1 imagedisp_l.convertTo(disp8u_l, CV_8U, 255/(maxVal - minVal));//(numberOfDisparities*16.)    cv::minMaxLoc( disp_r, &minVal, &maxVal );cout<<"Min disp: Max value"<< minVal<<maxVal; //numberOfDisparities.= (maxVal - minVal)//-- Display it as a CV_8UC1 imagedisp_r.convertTo(disp8u_r, CV_8U, 255/(maxVal - minVal));//(numberOfDisparities*16.)    cv::normalize(disp8u_l, disp8u_l, 0, 255, CV_MINMAX, CV_8UC1);    // obtain normalized image
    cv::normalize(disp8u_r, disp8u_r, 0, 255, CV_MINMAX, CV_8UC1);    // obtain normalized image    cv::imshow("Left",leftImage);
    cv::imshow("Right",rightImage);    cv::imshow("Elas_left",disp8u_l);
    cv::imshow("Elas_right",disp8u_r);
    cv::imwrite("Elas_left.png",disp8u_l);
    cv::imwrite("Elas_right.png",disp8u_r);cout<<endl<<"Over"<<endl;
    cv::waitKey(0);return 0;
}

1:BM算法

int StereoMatch::BMMatching()
{cv::Mat disp,disp8u;double minVal; double maxVal; //视差图的极值cv::Mat leftImage = cv::imread("../test_images/leftr.png",0);cv::Mat rightImage = cv::imread("../test_images/rightr.png",0);int SADWindowSize = 19;int numberOfDisparities =16*3; /**< Range of disparity */numberOfDisparities = numberOfDisparities > 0 ? numberOfDisparities : ((leftImage.cols/8) + 15) & -16;//bm.state->roi1 = remapMat.Calib_Roi_L;//左右视图的有效像素区域,一般由双目校正阶段的 cvStereoRectify 函数传递,也可以自行设定。//bm.state->roi2 = remapMat.Calib_Roi_R;//一旦在状态参数中设定了 roi1 和 roi2,OpenCV 会通过cvGetValidDisparityROI 函数计算出视差图的有效区域,在有效区域外的视差值将被清零。//bm.State->preFilterSize=41;//预处理滤波器窗口大小,5-21,oddbm.state->preFilterCap = 31; //63,1-31//预处理滤波器的截断值,预处理的输出值仅保留[-preFilterCap, preFilterCap]范围内的值,bm.state->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 9; //SAD窗口大小5-21bm.state->minDisparity = 0; //64 最小视差,默认值为 0bm.state->numberOfDisparities = numberOfDisparities; //128视差窗口,即最大视差值与最小视差值之差, 窗口大小必须是 16 的整数倍bm.state->textureThreshold = 10;//低纹理区域的判断阈值。如果当前SAD窗口内所有邻居像素点的x导数绝对值之和小于指定阈值,则该窗口对应的像素点的视差值为 0bm.state->uniquenessRatio = 15;//5-15 视差唯一性百分比, 视差窗口范围内最低代价是次低代价的(1 + uniquenessRatio/100)倍时,最低代价对应的视差值才是该像素点的视差,否则该像素点的视差为 0bm.state->speckleWindowSize = 100;//检查视差连通区域变化度的窗口大小, 值为 0 时取消 speckle 检查bm.state->speckleRange = 32;//视差变化阈值,当窗口内视差变化大于阈值时,该窗口内的视差清零bm.state->disp12MaxDiff = 1;//左视差图(直接计算得出)和右视差图(通过cvValidateDisparity计算得出)之间的最大容许差异。超过该阈值的视差值将被清零。该参数默认为 -1,即不执行左右视差检查。//注意在程序调试阶段最好保持该值为 -1,以便查看不同视差窗口生成的视差效果。// 计算视差bm(leftImage, rightImage, disp);//-- Check its extreme valuescv::minMaxLoc( disp, &minVal, &maxVal );cout<<"Min disp: Max value"<< minVal<<maxVal; //numberOfDisparities.= (maxVal - minVal)//-- 4. Display it as a CV_8UC1 imagedisp.convertTo(disp8u, CV_8U, 255/(maxVal - minVal));//(numberOfDisparities*16.)cv::normalize(disp8u, disp8u, 0, 255, CV_MINMAX, CV_8UC1);    // obtain normalized imagecv::imshow("left",leftImage);cv::imshow("right",leftImage);cv::imshow("Disp",disp8u);cv::imwrite("bm.png",disp8u);cv::waitKey(0);}

2:SGBM

int StereoMatch::SGBMMatching()
{cv::Mat disp,disp8u;double minVal; double maxVal; //视差图的极值cv::Mat leftImage = cv::imread("../test_images/leftr.png",0);cv::Mat rightImage = cv::imread("../test_images/rightr.png",0);int numberOfDisparities =16*2; /**< Range of disparity */numberOfDisparities = numberOfDisparities > 0 ? numberOfDisparities : ((leftImage.cols/8) + 15) & -16;int SADWindowSize = 11;sgbm.preFilterCap = 63;sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3; //3-11int cn = leftImage.channels();sgbm.P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;//P1、P2的值越大,视差越平滑。P2>P1,可取(50,800)或者(40,2500)sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;sgbm.minDisparity = 0;sgbm.numberOfDisparities = numberOfDisparities; //128,256sgbm.uniquenessRatio = 10;    //10,0sgbm.speckleWindowSize = 100; //200sgbm.speckleRange = 32;sgbm.disp12MaxDiff = 1;sgbm.fullDP = 1;// 计算视差sgbm(leftImage, rightImage, disp);//-- Check its extreme valuescv::minMaxLoc( disp, &minVal, &maxVal );cout<<"Min disp: Max value"<< minVal<<maxVal; //numberOfDisparities.= (maxVal - minVal)//-- 4. Display it as a CV_8UC1 imagedisp.convertTo(disp8u, CV_8U, 255/(maxVal - minVal));//(numberOfDisparities*16.)cv::normalize(disp8u, disp8u, 0, 255, CV_MINMAX, CV_8UC1);    // obtain normalized imagecv::imshow("left",leftImage);cv::imshow("right",leftImage);cv::imshow("Disp",disp8u);cv::imwrite("sgbm.png",disp8u);cv::waitKey(0);}

3:VAR

int StereoMatch::VARMatching()
{cv::Mat disp,disp8u;double minVal; double maxVal; //视差图的极值cv::Mat leftImage = cv::imread("../test_images/leftr.png",0);cv::Mat rightImage = cv::imread("../test_images/rightr.png",0);int numberOfDisparities =16*2; /**< Range of disparity */numberOfDisparities = numberOfDisparities > 0 ? numberOfDisparities : ((leftImage.cols/8) + 15) & -16;var.levels = 3;                                 // ignored with USE_AUTO_PARAMSvar.pyrScale = 0.5;                             // ignored with USE_AUTO_PARAMSvar.nIt = 25;var.minDisp = -numberOfDisparities;var.maxDisp = 0;var.poly_n = 3;var.poly_sigma = 0.0;var.fi = 15.0f;var.lambda = 0.03f;var.penalization = var.PENALIZATION_TICHONOV;   // ignored with USE_AUTO_PARAMSvar.cycle = var.CYCLE_V;                        // ignored with USE_AUTO_PARAMSvar.flags = var.USE_SMART_ID | var.USE_AUTO_PARAMS | var.USE_INITIAL_DISPARITY | var.USE_MEDIAN_FILTERING ;// 计算视差var(leftImage, rightImage, disp);//-- Check its extreme valuescv::minMaxLoc( disp, &minVal, &maxVal );cout<<"Min disp: Max value"<< minVal<<endl<<maxVal; //numberOfDisparities.= (maxVal - minVal)//-- 4. Display it as a CV_8UC1 imagedisp.convertTo(disp8u, CV_8U, 255/(maxVal - minVal));//(numberOfDisparities*16.)cv::normalize(disp8u, disp8u, 0, 255, CV_MINMAX, CV_8UC1);    // obtain normalized imagecv::imshow("left",leftImage);cv::imshow("right",leftImage);cv::imshow("Disp",disp8u);cv::imwrite("var.png",disp8u);cv::waitKey(0);}

4:GC
GC好像只有在c版本的,我这里做了两个,一个是C的,一个是改了接口的C++版本的。

int StereoMatch::GCMatching()
{IplImage * leftImage = cvLoadImage("../test_images/leftr31.png",0);IplImage * rightImage = cvLoadImage("../test_images/rightr31.png",0);CvStereoGCState* state = cvCreateStereoGCState( 16, 4 );IplImage * left_disp_  =cvCreateImage(cvGetSize(leftImage),leftImage->depth,1);IplImage * right_disp_ =cvCreateImage(cvGetSize(leftImage),leftImage->depth,1);cvFindStereoCorrespondenceGC( leftImage, rightImage, left_disp_, right_disp_, state, 0 );cvReleaseStereoGCState( &state );cvNamedWindow("Left",1);cvNamedWindow("Right",1);cvNamedWindow("GC_left",1);cvNamedWindow("GC_right",1);cvShowImage("Left",leftImage);cvShowImage("Right",rightImage);cvNormalize(left_disp_,left_disp_,0,255,CV_MINMAX,CV_8UC1);cvNormalize(right_disp_,right_disp_,0,255,CV_MINMAX,CV_8UC1);cvShowImage("GC_left",left_disp_);cvShowImage("GC_right",right_disp_);cvSaveImage("GC_left.png",left_disp_);cvSaveImage("GC_right.png",right_disp_);cout<<endl<<"Over"<<endl;cvWaitKey(0);cvDestroyAllWindows();cvReleaseImage(&leftImage);cvReleaseImage(&rightImage);return 0;
}
int StereoMatch::GCMatching_Mat()
{double minVal; double maxVal; //视差图的极值
    cv::Mat disp8u_l,disp8u_r;    cv::Mat leftImage = cv::imread("../test_images/leftr31.png",0);
    cv::Mat rightImage = cv::imread("../test_images/rightr31.png",0);CvStereoGCState* state = cvCreateStereoGCState( 16, 5 );
    cv::Mat left_disp_  =leftImage.clone();
    cv::Mat right_disp_ =rightImage.clone();IplImage temp = (IplImage)leftImage;IplImage* leftimg = &temp;IplImage temp1 = (IplImage)rightImage;IplImage* rightimg = &temp1;IplImage temp2 = (IplImage)left_disp_;IplImage* leftdisp = &temp2;IplImage temp3 = (IplImage)right_disp_;IplImage* rightdisp = &temp3;cvFindStereoCorrespondenceGC( leftimg, rightimg, leftdisp, rightdisp, state, 0 );cvReleaseStereoGCState( &state );    cv::namedWindow("Left",1);
    cv::namedWindow("Right",1);
    cv::namedWindow("GC_left",1);
    cv::namedWindow("GC_right",1);    cv::imshow("Left",leftImage);
    cv::imshow("Right",rightImage);/*    //-- Check its extreme values
    cv::minMaxLoc(right_disp_, &minVal, &maxVal );cout<<"Min disp: Max value"<< minVal<<maxVal; //numberOfDisparities.= (maxVal - minVal)//-- Display it as a CV_8UC1 imageright_disp_.convertTo(disp8u_r, CV_8U, 255/(maxVal - minVal));//(numberOfDisparities*16.)    cv::normalize(left_disp_,left_disp_,0,255,CV_MINMAX,CV_8UC1);
    cv::normalize(disp8u_r,disp8u_r,0,255,CV_MINMAX,CV_8UC1);
*/
    cv::normalize(left_disp_,left_disp_,0,255,CV_MINMAX,CV_8UC1);
    cv::normalize(right_disp_,right_disp_,0,255,CV_MINMAX,CV_8UC1);    cv::imshow("GC_left",left_disp_);
    cv::imshow("GC_right",right_disp_);
    cv::imwrite("GC_left.png",left_disp_);
    cv::imwrite("GC_right.png",right_disp_);cout<<endl<<"Over"<<endl;
    cv::waitKey(0);return 0;
}

基于Opencv的几种立体匹配算法+ELAS相关推荐

  1. OpenCv中实现了三种立体匹配算法:

    OpenCv中实现了三种立体匹配算法: BM算法 SGBM算法 Stereo Processing by Semiglobal Matching and Mutual Information GC算法 ...

  2. python 立体匹配算法_OpenCV3.4两种立体匹配算法效果对比

    以OpenCV自带的Aloe图像对为例: 1.BM算法(Block Matching) 参数设置如下: int numberOfDisparities = ((imgSize.width / 8) + ...

  3. Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图

    六种方法分别是:基于RGB分割,基于RG同道的分割,ycrcb+otsu(ostu可以参考http://blog.csdn.net/onezeros/article/details/6136770, ...

  4. 基于opencv的一种快速有效椭圆检测方法

    本篇介绍的椭圆检测方法来自以下论文,论文作者提供了测试代码.本文主要是对这个方法做出详解. 参考论文:A fast and effective ellipse detector for embedde ...

  5. python立体匹配误匹配率_立体匹配算法(Stereo Matching)及其在OpenCV中的应用

    模拟人的两只眼睛的Stereo相机最近变得很受欢迎.通过对stereo相机拍摄的左右两张图进行匹配找出视差图,可以还原物体的3D信息. 立体匹配(Stereo matching)的步骤如下: 1: 预 ...

  6. python去复杂的水印_两种Python基于OpenCV的固定位置半透明水印去除方案

    OpenCV基础 OpenCV(Open Source Computer Vision Library)是一个跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法 环境搭建 #python ...

  7. 局部立体匹配算法介绍及代码实现

    作者I dulingwen@CSDN 编辑I 3D视觉开发者社区 01 什么是局部匹配算法?优势如何? 局部(Local)立体匹配是相对于半全局以及全局(Non-Local)立体匹配算法而言的,它不构 ...

  8. 双目视觉(三)立体匹配算法

    系列文章: 双目视觉(一)双目视觉系统 双目视觉(二)双目匹配的困难和评判标准 双目视觉(三)立体匹配算法 双目视觉(四)匹配代价 双目视觉(五)立体匹配算法之动态规划全局匹配 双目视觉(六)U-V视 ...

  9. 基于OpenCV实战:提取中心线

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|AI算法与图像处理 问题 前几天有个人问了我一个问题,问 ...

  10. 基于深度学习算法和传统立体匹配算法的双目立体视觉

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01 立体视觉是什么? 在开始之前,我相信很多站友都会有这个疑问, ...

最新文章

  1. matlab中cell用法
  2. curl测试返回时间
  3. 鸿蒙公测新增6款手机,鸿蒙公测第二期报名入口 鸿蒙2.0第二期公测新增支持机型有哪些...
  4. svn 版本升级的问题
  5. 许家印深夜主持集团营销大会:恒大全国楼盘全线7折!
  6. oracle 11g 完美卸载,oracle 11g完美卸载
  7. jQuery设置文本框回车事件
  8. Hystrix断路器
  9. 图形变换之旋转变换公式推导
  10. win11取消右键菜单折叠恢复经典传统菜单模式方法解决
  11. Day 9 淘宝静态页面练习 reset.css样式重置 头部信息结构及样式 自定义图标的样式
  12. 【原】JUNIT 源码分析之TestSuite
  13. Redhat_rhel8.0_FTP服务配置
  14. 典藏推荐:《乱世佳人》(《飘》)
  15. 计算机基础实训项目二 Word 综合应用,计算机应用基础-实训项目二 Word 综合应用[优质文档]...
  16. Rust模板引擎Tera中文英文对照官方文档
  17. 利用python处理dna序列_Python + 生物信息 02 :Biopython 分析序列
  18. python:gettext --- 多语种国际化服务
  19. educoder 国标码转区位码实验(详细)
  20. 02【ArcGIS Pro SDK for Microsoft .NET】开发实现登录页面

热门文章

  1. 苹果cmsV10二开视频+图片+小说网站源码
  2. 社工程序员(社会工程学)有关概述与讲解
  3. Oracle的卸载步骤(详细图示)
  4. 视频教程-鼎捷易飞ERP视频教程-ERP
  5. 信噪比的定义及计算方法
  6. 夏普MAX3101N复印故障
  7. Git - 教程(廖雪峰)
  8. 图书管理数据库系统设计
  9. html设置等宽字体效果
  10. 《Java从入门到放弃》JavaSE入门篇:异常