前段时间需要用到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);