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;
}
#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;
}