win7下VS2012配置DirectShow+Opencv并且多摄像头采集

来源:互联网 发布:php file get content 编辑:程序博客网 时间:2024/05/07 00:28

配置环境:win7 64位旗舰版+VS2012+opencv2.4.9+Directshow


1.首先下载opencv2.4.9和配置opencv2.4.9。网上配置的方法很多,此处不再说明。

2.下载DirectShow,下载后解压。比如解压路径为:D:\DirectShow;

3.配置VS2012项目的属性:

             A.在"VC++目录"的"可执行文件目录"中添加D:\DirectShow\bin

             B.在"VC++目录"的"包含目录"中添加D:\DirectShow\include

             C.在"VC++目录"的"库目录"中添加D:\DirectShow\lib

             D.把D:\DirectShow\include中的"CameraDS.h"、"CameraDS.cpp"复制到项目当前目录下,并加载到项目的"头文件"、"源文件"中,如下图:

3.修改winNT.h

       以管理员身份(开始->所有程序->附件->命令提示符(右键,以管理员身份打开,然后打开目标文档))打开C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include目录

       在winNT.h文件第290行左右的如下两行

       typedef void *PVOID;

       typedef void *POINTER_64 PVOID64;

      之前添加:

      #define POINTER_64 __ptr64

4.添加主程序

程序如下:

#include <stdio.h>#include "camerads.h"#include <highgui.h>const char *g_szTitle = "Camera";int main(){int m_iCamCount = CCameraDS::CameraCount();printf("There are %d cameras.\n", m_iCamCount);if(m_iCamCount == 0){return (-1);}CCameraDS m_CamDS0;CCameraDS m_CamDS1;IplImage *pFrame0 = NULL;IplImage *pFrame1 = NULL;IplImage *pFrame2 = NULL;m_CamDS0.OpenCamera(0, false, 320, 240);m_CamDS1.OpenCamera(1, false, 320, 240);cvNamedWindow("video0");cvNamedWindow("video1");while(1){//获取一帧pFrame0 = m_CamDS0.QueryFrame();//显示cvShowImage("video0", pFrame0);//获取一帧pFrame1 = m_CamDS1.QueryFrame();//显示cvShowImage("video1", pFrame1);if (cvWaitKey(20) == 'q'){break;}}m_CamDS0.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头m_CamDS1.CloseCamera();cvDestroyWindow("video0");cvDestroyWindow("video1");return 0;}

程序实现同时控制2个摄像头采集图像。效果如下:


当尝试用相同的方式去打开第三个摄像头的时候,程序便产生异常报错

即当采用如下程序时,无法打开摄像头。

#include <stdio.h>#include "camerads.h"#include <highgui.h>const char *g_szTitle = "Camera";int main(){int m_iCamCount = CCameraDS::CameraCount();printf("There are %d cameras.\n", m_iCamCount);if(m_iCamCount == 0){return (-1);}CCameraDS m_CamDS0;CCameraDS m_CamDS1;CCameraDS m_CamDS2;IplImage *pFrame0 = NULL;IplImage *pFrame1 = NULL;IplImage *pFrame2 = NULL;m_CamDS0.OpenCamera(0, false, 320, 240);m_CamDS1.OpenCamera(1, false, 320, 240);m_CamDS1.OpenCamera(2, false, 320, 240);cvNamedWindow("video0");cvNamedWindow("video1");cvNamedWindow("video2");//cvNamedWindow("video1");//显示while(1){//获取一帧pFrame0 = m_CamDS0.QueryFrame();//显示cvShowImage("video0", pFrame0);//获取一帧pFrame1 = m_CamDS1.QueryFrame();//显示cvShowImage("video1", pFrame1);//获取一帧pFrame2 = m_CamDS2.QueryFrame();//显示cvShowImage("video2", pFrame2);if (cvWaitKey(20) == 'q'){break;}}m_CamDS0.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头m_CamDS1.CloseCamera();m_CamDS2.CloseCamera();cvDestroyWindow("video0");cvDestroyWindow("video1");cvDestroyWindow("video2");return 0;}

不能用以上程序同时打开3个摄像头,于是改变思路,修改程序,新程序如下:

#include <stdio.h>#include "camerads.h"#include <highgui.h>const char *g_szTitle = "Camera";int main(){// 1、考虑到已经存在了显示图像的窗口,那就不必再次驱动摄像头了,即便往下驱动那也是摄像头已被占用。//if(IsWindowVisible(FindWindow(NULL, g_szTitle)))//{//return (-1);//}//仅仅获取摄像头数目int m_iCamCount = CCameraDS::CameraCount();printf("There are %d cameras.\n", m_iCamCount);if(m_iCamCount == 0){return (-1);}CCameraDS m_CamDS0;CCameraDS m_CamDS1;//CCameraDS m_CamDS2;IplImage *pFrame0 = NULL;IplImage *pFrame1 = NULL;//IplImage *pFrame2 = NULL;//m_CamDS0.OpenCamera(0, false, 320, 240);//m_CamDS1.OpenCamera(1, false, 320, 240);//m_CamDS1.OpenCamera(2, false, 320, 240);cvNamedWindow("video0");cvNamedWindow("video1");cvNamedWindow("video2");//cvNamedWindow("video1");while(1){m_CamDS0.OpenCamera(0, false, 320, 240);pFrame0 = m_CamDS0.QueryFrame();//获取一帧cvShowImage("video0", pFrame0);//显示m_CamDS0.CloseCamera();m_CamDS1.OpenCamera(1, false, 320, 240);pFrame1 = m_CamDS1.QueryFrame();//获取一帧cvShowImage("video1", pFrame1);//显示m_CamDS1.CloseCamera();m_CamDS0.OpenCamera(2, false, 320, 240);pFrame0 = m_CamDS0.QueryFrame();//获取一帧cvShowImage("video2", pFrame0);//显示m_CamDS0.CloseCamera();//////获取一帧//pFrame2 = m_CamDS2.QueryFrame();//////显示//cvShowImage("video2", pFrame2);if (cvWaitKey(400) == 'q'){    break;}}m_CamDS0.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头m_CamDS1.CloseCamera();//m_CamDS2.CloseCamera();cvDestroyWindow("video0");cvDestroyWindow("video1");cvDestroyWindow("video2");return 0;}

以上程序思路为:打开一个摄像头后,采集图像然后关闭该摄像头,接着再去打开另一个摄像头,另一个摄像头打开后采集完图像再关闭,然后再打开了第一个摄像头。

但是,摄像头采集的视频很卡,效果不好。

程序效果如下:






1 0
原创粉丝点击