SAD stereo matching

 *opencv 实现的简单双目立体 的 SAD局部匹配算法
 *输入 imR 和 imL
 *输出 深度图DEPTH MAP
include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

int main()
{
	IplImage *R_img=cvLoadImage("imR.jpg",1);
	IplImage *L_img=cvLoadImage("imL.jpg",1);
	
	if(R_img==NULL||L_img==NULL)
	{
		cerr<<"fail to read images! "<<endl;
		exit(1);
	}

	const int N=5;//窗口大小的一半
	const int maxD=20;//最大视差

	int minD=20;

	int H=R_img->height;
	int W=R_img->width;
	
	IplImage *depth_map=cvCreateImage(cvSize(W,H),IPL_DEPTH_8U,1);// 深度图

	cvZero(depth_map);// 将深度图初始化为黑色

	int id=0;// 视差值

	CvRect L_roi,R_roi; // 窗口

	CvScalar scalar;

	double diff,temp_diff;

	IplImage *window=cvCreateImage(cvSize(2*N-1,2*N-1),L_img->depth,L_img->nChannels);

	for(int y=N;y<=H-N;y++)
	{
		for(int x=N;x<=W-N;x++)
		{
			R_roi=cvRect(x-N+1,y-N+1,2*N-1,2*N-1);
			cvSetImageROI(R_img,R_roi);

			for(int d=1;d<=maxD;d++)
			{
				if(x+d>=W-N)
					break;

				L_roi=cvRect(x+d-N+1,y-N+1,2*N-1,2*N-1);
			    cvSetImageROI(L_img,L_roi);

				cvAbsDiff(R_img,L_img,window);// 右ROI窗口 与 左ROI窗口 绝对差

				scalar=cvSum(window);         // 对窗口像素值求和

				cvResetImageROI(L_img);

				diff=(scalar.val[0]+scalar.val[1]+scalar.val[2])/3; // 三通道求均值

				if(d==1)
					temp_diff=diff;
				else if(diff<temp_diff)
				{
					// 求最佳匹配的视差
					temp_diff=diff;
					id=d;
				}


			}
			
			cvResetImageROI(R_img);

			// 深度图
			((uchar*)(depth_map->imageData +y*depth_map->widthStep))[x]=(uchar)(id*240/maxD);
		}
	}


	cvNamedWindow("the depth map",1);
	cvShowImage("the depth map",depth_map);
	cvWaitKey(0);

	cvDestroyWindow("the depth map");
	cvReleaseImage(&depth_map);
	cvReleaseImage(&window);
	cvReleaseImage(&L_img);
	cvReleaseImage(&R_img);


	return 0;
}
SAD stereo matching_第1张图片
imR   
SAD stereo matching_第2张图片
  imL                                  
SAD stereo matching_第3张图片
DEPTH MAP




你可能感兴趣的:(SAD stereo matching)