http://blog.csdn.net/hardVB/archive/2007/07/11/1685493.aspxwww
opencv提供了双目视觉检测距离信息的函数,试着使用了两个摄像头获得两副图像测试一下,感觉背景单纯,目标较小的情况下,得到的效果较好一些。(下图分别是左图像,右图像,得到的深度图像)
用一个长的物体来测试深度,效果不好。如下:
难点问题是两个摄像机即使是同一个机型,同样的镜头,得到的图像颜色有所轻微的差别,导致效果不好。
而使用一个摄像机平移左右得到的结果会更好一些。以下图片是opencv提供的图片,效果较好。
代码:
#include " stdafx.h "#include < iostream >
#include < string .h >
#include < cxcore.h >
#include < cv.h >
#include < cvaux.h >
#include < highgui.h >
#include < fstream >
IplImage * image = 0 ; // 原始图像
using namespace std;
int main( int argc, char * argv[])
{
IplImage * srcLeft = cvLoadImage( " left.jpg " , 1 );
IplImage * srcRight = cvLoadImage( " right.jpg " , 1 );
IplImage * leftImage = cvCreateImage(cvGetSize(srcLeft), IPL_DEPTH_8U, 1 );
IplImage * rightImage = cvCreateImage(cvGetSize(srcRight), IPL_DEPTH_8U, 1 );
IplImage * depthImage = cvCreateImage(cvGetSize(srcRight), IPL_DEPTH_8U, 1 );
cvCvtColor(srcLeft, leftImage, CV_BGR2GRAY);
cvCvtColor(srcRight, rightImage, CV_BGR2GRAY);
cvFindStereoCorrespondence( leftImage, rightImage, CV_DISPARITY_BIRCHFIELD, depthImage, 50 , 15 , 3 , 6 , 8 , 15 );
cvNamedWindow( " win1 " , 1 );
cvNamedWindow( " win2 " , 1 );
cvNamedWindow( " win3 " , 1 );
cvNormalize(depthImage,depthImage, 0 , 255 ,CV_MINMAX, 0 );
for (;;)
{
cvShowImage( " win1 " ,depthImage);
cvShowImage( " win2 " ,srcLeft);
cvShowImage( " win3 " ,srcRight);
if (cvWaitKey( 20 ) == 27 ) break ;
}
return 0 ;
}