环境:vs2010+opencv2.4.9
为了实现双目摄像头的读取,搜集了一些资料,有人说用directshow来实现,有人说直接可以用opencv读取多个摄像头。那么,既然opencv能实现,为什么还要装其他的库呢?现在就来介绍使用opencv读取并显示双目摄像头。另外我的双目摄像头仅仅只是两个合在一起的只有一条USB线的。
opencv读取并显示双目摄像头示例
直接上代码:
#include <opencv2/opencv.hpp>
using namespace std;
int main()
{
//initialize and allocate memory to load the video stream from camera
cv::VideoCapture camera0(1);
camera0.set(CV_CAP_PROP_FRAME_WIDTH,320);
camera0.set(CV_CAP_PROP_FRAME_HEIGHT,240);
cv::VideoCapture camera1(0);
camera1.set(CV_CAP_PROP_FRAME_WIDTH,320);
camera1.set(CV_CAP_PROP_FRAME_HEIGHT,240);
if( !camera0.isOpened() ) return 1;
if( !camera1.isOpened() ) return 1;
while(true) {
//grab and retrieve each frames of the video sequentially
cv::Mat3b frame0;
camera0 >> frame0;
cv::Mat3b frame1;
camera1 >> frame1;
cv::imshow("Video0", frame0);
cv::imshow("Video1", frame1);
// std::cout << frame1.rows() << std::endl;
//wait for 40 milliseconds
int c = cvWaitKey(40);
//exit the loop if user press "Esc" key (ASCII value of "Esc" is 27)
if(27 == char(c)) break;
}
return 0;
}
输出图片如下:
需要注意的是:
1、本来我的图是640*480的,但是单纯显示这种分辨率的图,只有video0能正常显示,而video1显示的灰色,根本没有imshow出任何信息。所以,我直接降低分辨率进行显示,原因是因为一条usb hub线的带宽有限。
2、摄像头的序号在opencv中是采用降序的形式,才能正确读取多个摄像头,否则就不能。
3、因为的环境是基于win7的,同时携带了360安全卫士,在运行此程序的时候关掉360卫士,否则只有video0能正常显示,而video1只显示灰色信息。