OpenCV中GC方法求视差图的实现

前段时间需要用到GC方法实现视差图,参考了http://blog.csdn.net/mailang2008/article/details/5873883的内容,

试验之后发现还有一些需要注意的地方,记录下来方便以后查看

1.影像的读取

由于GC方法要求左右影像均是8位的灰度图像故读取影像时需要进行一次转换。

//读取左右影像
	IplImage* pImgleft = cvLoadImage("left.bmp",0);
	CvMat* LEFT=cvCreateMat(pImgleft->height,pImgleft->width,CV_8UC1);
	cvConvert(pImgleft,LEFT);

	IplImage* pImgright = cvLoadImage("right.bmp",0);
	CvMat* RTGHT=cvCreateMat(pImgright->height,pImgright->width,CV_8UC1);
	cvConvert(pImgright,RTGHT);
2.生成视差图

要注意输入的左右图像以及输出的左右视差图均为CvMat*类型。

		CvStereoGCState* state = cvCreateStereoGCState(16,2);
		CvMat* left_disp_ = cvCreateMat(LEFT->height,LEFT->width,CV_16S);
		CvMat* right_disp_ = cvCreateMat(RTGHT->height,RTGHT->width,CV_16S);

		cvFindStereoCorrespondenceGC(LEFT,RTGHT,left_disp_,right_disp_,state,0);
		cvReleaseStereoGCState(&state);
3.显示视差图

这一部分要尤其注意,GC算法支持的CV_16S格式的disparity矩阵需要除以16才能得到正确的视差(左影像应该除以-16,因为左影像的视差值为负),如果不注意这一点的话,得到的视差图往往会是一片黑色。

		CvMat* disparity_left = cvCreateMat(left_disp_->height,left_disp_->width, CV_8U );
		cvConvertScale( left_disp_, disparity_left,-16);
		cvSaveImage( "disparity.bmp",disparity_left);




SGBM(Semi-Global Block Matching)是OpenCV用于计算视差图的一种算法。视差图是描述立体视觉离相机平面的距离差异的一种像。 SGBM算法在计算视差图时,首先需要对左右两个像进行预处理,包括灰度化、去噪等操作,然后使用代价函数来计算视差值。代价函数根据左右像的像素强度差异来衡量视差值的可能性,常用的代价函数有SAD(Sum of Absolute Differences)、SSD(Sum of Squared Differences)等。 在SGBM算法,为了减少计算量和提高计算的准确性,会将分割成若干个小块,并使用块匹配的方式计算每个块的相关性。这种方法可以减少计算量,并且能够处理不同区域的视差变化。 计算出每个块的相关性后,SGBM算法会进行视差值的优化,通过全局优化和局部优化来得到最终的视差图。全局优化主要是通过梯度约束和平滑度约束来减少视差图的噪声,并使得视差变化更加平滑。局部优化则是为了进一步优化局部区域的视差值,通过调整权重和代价函数来得到更准确的视差图。 最后得到的视差图可以用于计算深度、三维重建等应用,对于视觉导航、机器人感知等方面都具有很大的帮助。 总而言之,SGBM算法是OpenCV用于计算视差图的一种算法,通过对像进行预处理,使用代价函数计算视差值,然后通过全局和局部优化得到最终的视差图。这一视差图可以应用于多个领域,为实现深度感知和三维重建等应用提供数据基础。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值