博主打算做双目测距的实验,因此需要用到双目摄像头。使用过下述几种类型的双目摄像头:
1.集成两个摄像头的模组(单个USB插口,左右图像单独输出)
这类摄像头插入后会显示两个摄像头输入,但可能是由于共用同一个USB传输的原因,有时候同时打开两个摄像头后,另外一个摄像头的画面会显示不出来。
如果要同时输入两个单独的摄像头,最好是使用不同型号的摄像头。
2.两个相同的单目摄像头(两个USB插口,左右图像单独输出)
两个单独的摄像头分别通过各自的USB输入就不会出现上述问题,但是两摄像头的同步性可能不是很好(对于普通实验其实影响不大),且博主之后打算做多目的实验,USB接口有限(使用hub同样会出现上述的问题),所以经过一段时间的使用之后,最后是选择使用下一种类型的双目摄像头。
3.集成两个摄像头的模组(两个USB插口,左右图像合成输出)
这类摄像头和第一类的区别在于左右图像在模组中已经进行了拼接合成,最后传输出来的是单张合成的图像,在串口中也只是显示一个摄像头。例如,博主购买的这款单个摄像头输出1280x960的图像,通过合成后USB输出2560x960的合成图像。这类摄像头解决了上述两种双目摄像头的缺点,但是图像在opencv中处理时,需要事先进行图像分割。
对于第一和第二类双目摄像头,在程序中都需要单独输入两个摄像头图像。
#include
#include
using namespace cv;
int main()
{
VideoCapture cap1(0),cap2(1);//define two capture for two cameras
while (1)
{
Mat frame1, frame2;
cap1 >> frame1;
cap2 >> frame2;
imshow("leftImage", frame1);//left image
imshow("rightImage", frame2);//right image
waitKey(33);
}
return 0;
}
ps:使用VideoCapture
类定义时,括号内数字为摄像头串口的编号,通常是0,1,-1,2,第二个摄像头可能需要多试几下。
对于第三类摄像头,串口输入的是左右摄像头拼接合成后的图像,在opencv中进行图像处理之前,应将合成图像分割成左右两张图像。
#include
#include
#include
using namespace cv;
int main()
{
VideoCapture cap(0);
while (1)
{
Mat frame;
cap >> frame;
resize(frame, frame, Size(1280, 480));//set size of image
Mat leftImage, rightImage;
leftImage = frame(Rect(0, 0, frame.size().width / 2, frame.size().height));//split left image
rightImage = frame(Rect(frame.size().width / 2, 0, frame.size().width / 2, frame.size().height));//split right image
imshow("leftImage", leftImage);//left image
imshow("rightImage", rightImage);//right image
waitKey(33);
}
return 0;
}
ps: 1.源图像使用resize()
调整图像大小,需要包含imgproc.hpp
头文件。
2.Rect(x,y,width,height)
四个参数分别是起点横坐标、起点纵坐标、宽度和高度,早期使用容易犯错认为后两个参数是终点横纵坐标。
第一次写博客,如有错误,欢迎指正!