OpenCV学习笔记(6)基于 VC+OpenCV+DirectShow 的多个摄像头同

因项目需要采集2个摄像头的数据进行双目检测,一开始采用以下代码来测试:

#include #include #include #include argv[]){CvCapture );CvCapture );;cvSetCaptureProperty ( capture1, CV_CAP_PROP_FRAME_WIDTH, w );cvSetCaptureProperty ( capture1, CV_CAP_PROP_FRAME_HEIGHT, h );cvSetCaptureProperty ( capture2, CV_CAP_PROP_FRAME_WIDTH, w );cvSetCaptureProperty ( capture2, CV_CAP_PROP_FRAME_HEIGHT, h );cvNamedWindow( , CV_WINDOW_AUTOSIZE );cvNamedWindow( , CV_WINDOW_AUTOSIZE );IplImage* frame1;IplImage* frame2;;){frame1 = cvQueryFrame( capture1 );;cvShowImage( , frame1 );frame2 = cvQueryFrame( capture2 );;cvShowImage( , frame2 ););;}cvReleaseCapture( &capture1 );cvReleaseCapture( &capture2 );cvDestroyWindow( );cvDestroyWindow( );;}

这个程序在使用不同类型的摄像头时,例如我使用一个普通的网络摄像头,另外一个是手机上的摄像头(这款手机具有网络摄像头功能),这样的话程序就能正常运行;但如果摄像头是相同类型时,就只能读取其中一个摄像头的数据了,第二个窗口则是一片灰色。查阅开发文档资料得知 cvCreateCameraCapture(int index) 函数可以选择摄像头,但实际测试发现 cvCreateCameraCapture 只接受 –1 和 0 两种参数,其他值,如1,2,101,102,201,202…全都无法正确的切换到第二个接入的摄像头。如果两个 capture 都使用 cvCreateCameraCapture(-1),是可以切换到第二个摄像头,但当第二次执行 cvCreateCameraCapture() 函数时,会强行弹出选择摄像头的对话框要你手动选择,而且以后再添加摄像头的话,还得修改代码重新build,实际项目中肯定不能这样处理。在OpenCV中文论坛上找到的解释是,如果摄像头的名称是“USB视频设备 #*”,则 OpenCV 只能读取其中一个的数据。

查阅opencv的cvcam官方文档,找到一些资料:

/*Begin work with cvcam, you can select single or multiple cameras in 2 ways. The first is using a camera selection dialog with cvcamSelectCamera. See an example below: /*Pops up a camera(s) selection dialog Return value – number of cameras selected (0,1 or 2); Argument: an array of selected cameras numbers NULL if none selected. Should be released with free() when not needed. if NULL passed, not used. */ CVCAM_API ); Function ThatSelectsCamera() { ; ); )printf(]); )printf(]); free(out); return; }/*Note: if you don’t need selected cameras numbers, simply call cvcamSelectCamera(NULL) Note2: Linux version of cvcam currently has no implementation of cvcamSelectCamera. cvcamSetProperty(desiredcamera, CVCAM_PROP_ENABLE,CVCAMTRUE);

根据上述说明,我找到了下面这段对应的代码,不过应该是用 VC6+OpenCV1.0 写的,在我的机子上(VS2008+OpenCV2.0)运行不了,不能验证是否有效,不过还是贴出来供大家讨论:

#include #include #include #include frame2);param);IplImage image2;};};void main(){HWND CaptureWindow1=0;HWND CaptureWindow2=0;获取摄像头的个数//用对话框的形式来选取摄像头CameraNumber;CameraNumber);/* //灰色图像image1=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,1);image2=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,1););image2);//初始化两个摄像头);CaptureWindow1);cvcamSetProperty(CameraNumber[0], CVCAM_PROP_ENABLE, CVCAMTRUE);cvcamSetProperty(CameraNumber[0], CVCAM_PROP_RENDER, CVCAMTRUE);cvcamSetProperty(CameraNumber[CaptureWindow1);cvSetMouseCallback();cvNamedWindow();CaptureWindow2);cvcamSetProperty(CameraNumber[1], CVCAM_PROP_ENABLE, CVCAMTRUE);cvcamSetProperty(CameraNumber[1], CVCAM_PROP_RENDER, CVCAMTRUE);cvcamSetProperty(CameraNumber[CaptureWindow2);//让两个摄像头同步 StereoCallback);//启动程序 cvcamInit();cvcamStart();cvWaitKey(0);cvcamStop();cvcamExit();free(CameraNumber);cvDestroyWindow();cvDestroyWindow();}frame2){/* //把图像转换成灰度图并保存到image中cvCvtColor(frame1,image1,CV_RGB2GRAY);cvCvtColor(frame2,image2,CV_RGB2GRAY); cvCopy(frame1,image1);cvCopy(frame2,image2);// image1=cvCloneImage(frame1);// image2=cvCloneImage(frame2););cvFlip(image2,image2,0);}param){;CV_EVENT_LBUTTONDOWN){cvcamPause();//图像保存cvSaveImage(strleft[num],image1);cvSaveImage(strright[num],image2);// cvSaveImage(“left.bmp”,image1);// cvSaveImage(“right.bmp”,image2);}CV_EVENT_RBUTTONDOWN){cvcamResume();num++;}}

旁观者的姓名永远爬不到比赛的计分板上。

OpenCV学习笔记(6)基于 VC+OpenCV+DirectShow 的多个摄像头同

相关文章:

你感兴趣的文章:

标签云: