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