双目立体视觉SAD匹配算法

1.算法原理
        SAD(Sum of absolute differences)是一种图像匹配算法。基本思想:差的绝对值之和。此算法常用于图像块匹配,将每个像素对应数值之差的绝对值求和,据此评估两个图像块的相似度。该算法快速、但并不精确,通常用于多级处理的初步筛选。
2.基本流程

输入:两幅图像,一幅Left-Image,一幅Right-Image

对左图,依次扫描,选定一个锚点:

(1)构造一个小窗口,类似于卷积核;
(2)用窗口覆盖左边的图像,选择出窗口覆盖区域内的所有像素点;
(3)同样用窗口覆盖右边的图像并选择出覆盖区域的像素点;
(4)左边覆盖区域减去右边覆盖区域,并求出所有像素点灰度差的绝对值之和;
(5)移动右边图像的窗口,重复(3)-(4)的处理(这里有个搜索范围,超过这个范围跳出);
(6)找到这个范围内SAD值最小的窗口,即找到了左图锚点的最佳匹配的像素块。


参考代码:SAD.h

#include"iostream"
#include"opencv2/opencv.hpp"
#include"iomanip"
using namespace std;
using namespace cv;

class SAD
{
	public:
		SAD():winSize(7),DSR(30){}
		SAD(int _winSize,int _DSR):winSize(_winSize),DSR(_DSR){}
		Mat computerSAD(Mat &L,Mat &R); //计算SAD
	private:
		int winSize; //卷积核的尺寸
		int DSR;     //视差搜索范围
	
};

 Mat SAD::computerSAD(Mat &L,Mat &R)
	{
		int Height=L.rows;
	    int Width=L.cols;
		Mat Kernel_L(Size(winSize,winSize),CV_8U,Scalar::all(0));
	    Mat Kernel_R(Size(winSize,winSize),CV_8U,Scalar::all(0));
	    Mat Disparity(Height,Width,CV_8U,Scalar(0)); //视差图

		for(int i=0;i<Width-winSize;i++)  //左图从DSR开始遍历
		{
			for(int j=0;j<Height-winSize;j++)
			{
				Kernel_L=L(Rect(i,j,winSize,winSize));
			    Mat MM(1,DSR,CV_32F,Scalar(0)); //

				for(int k=0;k<DSR;k++)
				{
					int x=i-k;
					if(x>=0)
					{
					Kernel_R=R(Rect(x,j,winSize,winSize));
					Mat Dif;
			        absdiff(Kernel_L, Kernel_R, Dif);//
					Scalar ADD=sum(Dif);
					float a=ADD[0];
					MM.at<float>(k)=a;
					}
					
				}
				Point minLoc;
                minMaxLoc(MM, NULL, NULL,&minLoc,NULL);
			    
				int loc=minLoc.x;
				//int loc=DSR-loc;
				Disparity.at<char>(j,i)=loc*16;
				
			}
			double rate=double(i)/(Width);
			cout<<"已完成"<<setprecision(2)<<rate*100<<"%"<<endl; //处理进度
		}
		return Disparity;
	}
主函数:

// MySAD.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include"SAD.h"
int _tmain(int argc, _TCHAR* argv[])
{
	Mat Img_L=imread("imL.png",0);
	Mat Img_R=imread("imR.png",0);
    Mat Disparity;    //视差图
    
	//SAD mySAD;
	SAD mySAD(7,30);
	Disparity=mySAD.computerSAD(Img_L,Img_R);

	imshow("Img_L",Img_L);
	imshow("Img_R",Img_R);
	imshow("Disparity",Disparity);
	waitKey();
	return 0;
}


更多资源:http://blog.csdn.net/tulun/article/details/6456188

                   http://blog.csdn.net/chenyusiyuan/article/details/5967291

双目立体匹配是一种计算机视觉中的技术,主要用于将双目摄像头获取的两个视角的图像进行配准,获得二者之间的深度信息。Python是一种流行的编程语言,被广泛应用于科学计算和计算机视觉领域。 双目立体匹配算法旨在通过分析两个视角上的图像,找到对应点的像素坐标,进而计算该点的深度。这个过程涉及到图像预处理、特征提取以及匹配搜索等步骤。 在Python中,有许多开源的库和工具可用于实现双目立体匹配。例如,OpenCV库提供了丰富的图像处理和计算机视觉算法,包括双目立体匹配算法。使用OpenCV,我们可以通过加载两个视角的图像,获取它们的特征点,然后应用立体匹配算法来生成深度图。 Sad(Sum of Absolute Differences)是一种常用的匹配代价度量方法,用于计算两个像素块之间的差异。在双目立体匹配中,Sad是一种常用的代价度量方法之一,用于衡量两个像素块之间的相似度。通过计算像素块的Sad值,我们可以确定最佳匹配,并从而估计深度信息。 Python作为一种易学易用的编程语言,广泛运用于双目立体匹配的实现和应用中。它具有丰富的图像处理和计算机视觉库,并且有着不断更新和完善的社区支持。与其他编程语言相比,Python的语法简洁直观,使得双目立体匹配算法的实现更加便捷和高效。 总而言之,双目立体匹配是计算机视觉中的一项重要技术,而Python作为一种流行的编程语言,能够提供丰富的工具和库来实现该技术。通过使用Python和相关的图像处理库,我们可以实现双目立体匹配算法,从而获取深度图像,并在诸多应用领域中发挥其重要作用。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值