一:原理

双目立体视觉技术是仿照人类利用双目线索感知深度信息的方法,实现对三维信息的感知。为解决智能机器人抓取物体、视觉导航、目标跟踪等奠定基础。

双目立体视觉(Binocular Stereo Vision)是机器视觉的一种重要形式,它是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点之间的位置偏差,来获取物体三维几何信息的方法。融合两只眼睛获取的图像并观察它们之间的差别,使我们可以获得明显的深度感,建立特征间的对应关系,将同一空间物理点在不同图像中的映像点对应起来,这个差别,我们称作为视差(Disparity)图像。

立体匹配算法,包括SSD、SAD、SSD、NCC、NSSD、Census 等基本算法,本实验采用SAD算法。SAD算法是一种最简单的匹配算法,用公式表示为:

SAD(u,v) = Sum{|Left(u,v) - Right(u,v)|} 选择最小值。此种方法就是以左目图像的源匹配点为中心,定义一个窗口D,其大小为(2m+1) (2n+1),统计其窗口的灰度值的和,然后在右目图像中逐步计算其左右窗口的灰度和的差值,最后搜索到的差值最小的区域的中心像素即为匹配点。

二:运行结果




三:程序

// Sum of Absolute Difference(SAD) #include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <math.h>
#include <ctime>using namespace std;template<class T> class Image
{
private:IplImage* imgp;public:Image(IplImage* img = 0){ imgp = img; }~Image(){ imgp = 0; }void operator=(IplImage* img){ imgp = img; }inline T* operator[](const int rowIndx){return((T*)(imgp->imageData + rowIndx*imgp->widthStep));}
};typedef struct
{unsigned char b, g, r;
}RgbPixel;typedef struct
{float b, g, r;
}RgbPixelFloat;typedef Image<RgbPixel> RgbImage;
typedef Image<RgbPixelFloat> RgbImageFloat;
typedef Image<unsigned char> BwImage;
typedef Image<float> BwImageFloat;//display an image in a new window with title to be given.
void displayImageNewWindow(char* title, CvArr* img)
{cvNamedWindow(title, CV_WINDOW_AUTOSIZE);cvShowImage(title, img);
}int getMaxMin(double value[], int valueSize, int maxmin)
{int pos = 0;int i = 0;double max1 = -1;//?-999999;double min1 = 999999;if (maxmin == 1){//find maxfor (i = 0; i<valueSize; i++){//find the index with the max value;if (value[i]>max1){pos = i;max1 = value[i];}}}if (maxmin == 0){//find minfor (i = 0; i<valueSize; i++){//find the index with the minimum value;if (value[i]<min1){pos = i;min1 = value[i];}}}return pos;
}IplImage* generateDisparityImage(IplImage* greyLeftImg32, IplImage* greyRightImg32, int windowSize, int DSR)
{int offset = floor((double)windowSize / 2);int height = greyLeftImg32->height;int width = greyLeftImg32->width;double* localSAD = new double[DSR];int x = 0, y = 0, d = 0, m = 0;int N = windowSize;IplImage* winImg = cvCreateImage(cvSize(N, N), 32, 1);//mySubImage(greyLeftImg32,cvRect(0,0,N,N));IplImage* disparity = cvCreateImage(cvSize(width, height), 8, 1);//or IPL_DEPTH_8UBwImage imgA(disparity);for (y = 0; y<height; y++){for (x = 0; x<width; x++){imgA[y][x] = 0;}}CvScalar sum;//CvScalar s2;for (y = 0; y<height - N; y++){//height-Nfor (x = 0; x<width - N; x++){//width-NcvSetImageROI(greyLeftImg32, cvRect(x, y, N, N));d = 0;//initialise localSADfor (m = 0; m<DSR; m++){localSAD[m] = 0;}//start matchingdo{if (x - d >= 0){cvSetImageROI(greyRightImg32, cvRect(x - d, y, N, N));}else{break;}cvAbsDiff(greyLeftImg32, greyRightImg32, winImg);//absolute differencesum = cvSum(winImg);//sumlocalSAD[d] = sum.val[0];//0 means single channelcvResetImageROI(greyRightImg32);d++;} while (d <= DSR);//to find the best d and storeimgA[y + offset][x + offset] = getMaxMin(localSAD, DSR, 0) * 16; //0 means return minimum indexcvResetImageROI(greyLeftImg32);}//xif (y % 10 == 0)cout << "row=" << y << " of " << height << endl;}//ycvReleaseImage(&winImg);//cvReleaseImage(&rightWinImg);return disparity;
}int main(int argc, char * const argv[])
{cout << "Sum of Absolute Difference(SAD) Strereo Vision" << endl;//**********image input*********************// char* filename1 = "L.png";//im2_cone.pngIplImage* greyLeftImg = cvLoadImage(filename1, 0);char* filename2 = "R.png";IplImage* greyRightImg = cvLoadImage(filename2, 0);if (greyLeftImg == NULL){ cout << "No valid image input." << endl; return 1; }if (greyRightImg == NULL){ cout << "No valid image input." << endl; return 1; }int width = greyLeftImg->width;int height = greyLeftImg->height;/****************8U to 32F**********************/IplImage* greyLeftImg32 = cvCreateImage(cvSize(width, height), 32, 1);//IPL_DEPTH_32FIplImage* greyRightImg32 = cvCreateImage(cvSize(width, height), 32, 1);cvConvertScale(greyLeftImg, greyLeftImg32, 1 / 255.);cvConvertScale(greyRightImg, greyRightImg32, 1 / 255.);//1/255. equals to 1/255.0//-------------obtain disparity image----------------time_t tstart, tend;tstart = time(0);int windowSize = 13, DSR = 20;//Disparity Search RangeIplImage* disparity32 = generateDisparityImage(greyLeftImg32, greyRightImg32, windowSize, DSR);tend = time(0);cout << "It took " << difftime(tend, tstart) << " second(s)." << endl;displayImageNewWindow("Dispairty Image", disparity32);displayImageNewWindow("Left Image", greyLeftImg32);displayImageNewWindow("Right Image", greyRightImg32);//********destroy window************/cvWaitKey(0);cvReleaseImage(&greyLeftImg32);cvReleaseImage(&greyRightImg32);cvReleaseImage(&greyLeftImg);cvReleaseImage(&greyRightImg);cvReleaseImage(&disparity32);cvDestroyWindow("Left Image");cvDestroyWindow("Right Image");cvDestroyWindow("Dispairty Image");return 0;
}


OpenCV——SAD立体匹配相关推荐

  1. 【重要】opencv实现立体匹配

    感谢分享!!原文转自:https://blog.csdn.net/scyscyao/article/details/5443341 尝试用OpenCV来实现立体视觉也有一段时间了,主要的参考资料就是L ...

  2. 【立体匹配之一】StereoBM

    关于立体匹配的文章看多了,总想自己也动手写一写,在没开始之前,我们先看看OpenCV在立体匹配方面有哪些可以借鉴的地方,这里我们先从基础的BM算法入手. 如果,调用OpenCV库的BM算法,只需要两个 ...

  3. 双目立体视觉源代码 双目立体视觉匹配程序 双目视觉3d成像(三维重构图像处理) 基于双目视觉的深度计算和三维重建 opencv写的双目视觉摄像机标定和三维重建代码

    双目视觉/双目标定源码/图片集标定匹配三维重建坐标计算OpenCV 1.双目立体视觉源代码(包括标定,匹配,三维重建) 2.双目视觉实验图片集(双目立体视觉中使用的标准实验图,适合初学者进 行实验使用 ...

  4. 论文笔记-Self-Supervised Monocular Depth Hints

    论文信息 论文标题:Self-Supervised Monocular Depth Hints 论文作者:Jamie Watson, Michael Firman, Gabriel J. Brosto ...

  5. 立体匹配成像算法BM,SGBM,GC,SAD一览

    本文转自|新机器视觉 在深度相机的主流技术方案Structure Light,ToF,Stereo Dual)中,主动双目成像方案可以基于低成本的硬件,获得高分辨率.高精度的深度图像,但是立体匹配算法 ...

  6. 双目立体匹配 SAD

    最近开始研究双目匹配算法,于是在网上代码网站比如CSDN,GITHUB,虽然找到很多代码,但是由于用的编译环境或者库不一样,导致有些代码无法理解,所以,为了得到自己想要的结果,本人花了几天的时间根据算 ...

  7. 【OpenCV】双目测距(双目标定、双目校正和立体匹配)

    本文采用MATLAB标定工具箱和OpenCV3.10来实现双目测距,设备为两个CMOS工业相机和相应的双目云台. 首先感谢CSDN上两位大神前辈邹宇华和scyscyao,虽然是六年前的博客,OpenC ...

  8. SAD立体匹配算法在opencv中的实现

    FROM:http://blog.csdn.net/tulun/article/details/6456188 SAD算法具体原理见相关图像处理书籍. 该程序是opencv中文论坛的牛人贡献的,感谢他 ...

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

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

  10. 基于MFC和OpenCV的摄像机定标与立体匹配测试程序

    最近整理了一下这两年一直在用的摄像机定标与立体匹配测试程序,将代码进行了重构,界面也做了调整,分享出来方便有需要的朋友使用.当然我的编程能力有限,程序可能还有各种bug,请大家多多包涵.相关问题欢迎留 ...

最新文章

  1. ​“好师父”如何破解大学生就业难题
  2. ⑨ 设计模式的艺术-22.中介者(Mediator)模式
  3. qtextbrowser 大量数据卡顿_800万行的数据,Excel 10秒钟就能完成统计?这个工具太良心了!...
  4. 利用Swift语言特性,随手写个伪随机数生成器
  5. 推你所想,神策智能推荐 Demo 上线(可免费体验)
  6. jq设置checked是否选中_javascript之jquery如何判断input type=checkbox中checked是否存在选中项呢?...
  7. npm 安装less插件_node+npm+webpack+less安装
  8. 阿里云、蚂蚁开源 Nydus——容器镜像加速服务
  9. Blockchain.com,Eden Block,DACM等知名公司加入Pocket生态
  10. 单片机can通信可以接多少个设备_总结BMS上CAN收发器电路的几个要点
  11. 小姐姐给我讲,一听就懂的财务报表
  12. maltab利用plot画图后更改线条颜色
  13. 二叉树前序、中序、后序遍历(八)
  14. 我们究竟什么时候可以使用Ehcache缓存(转)
  15. spf打包解包_SPF’校园管理项目实训-1
  16. dblink连接远程mysql_MySQL中使用federated 实现dblink 远程表访问
  17. 四年级信息技术上册课本上类似于logo的绘图编程语言-GoC之不为人知的技巧
  18. chromeos java安装_试用额外硬件驱动和完整JAVA支持的ChromeOS
  19. 当年绑架李嘉诚之子后,张子强与李嘉诚对话的细节
  20. 初识C语言之条件结构篇——带你认知编程世界的逻辑之美!

热门文章

  1. rabbitmq,stomp.js,rabbitmq-auth-backend-http,消息调研,消息设计
  2. mysql配置文件中bind_bind配置语法详解 | 羽飞博客
  3. 苹果手机计算机怎么打分数,请问苹果手机计算器问题怎么处理的
  4. BLDC无刷直流电机的原理及驱动基础
  5. 本科毕业设计(论文)格式最详细总结
  6. 大学如何自学嵌入式开发?
  7. 需求调研第三篇--现场调研阶段容易犯哪些错误
  8. 怎么给视频打马赛克?视频剪辑时快速添加马赛克的方法
  9. LOVE2D android竖屏的问题
  10. 分位数回归(Stata)