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;
- }
(hardVB) |