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;}
以上程序思路为:打开一个摄像头后,采集图像然后关闭该摄像头,接着再去打开另一个摄像头,另一个摄像头打开后采集完图像再关闭,然后再打开了第一个摄像头。
但是,摄像头采集的视频很卡,效果不好。
程序效果如下:
- win7下VS2012配置DirectShow+Opencv并且多摄像头采集
- Win10下VS2015配置DirectShow+OpenCV并且多摄像头的采集
- VS2012下配置opencv+directshow(CCameraDS),支持多摄像头 转载自叶科忠's Blog
- USB免驱摄像头采集图像【VS2012+opencv+directShow(CcameraDS)实现】
- Windows下摄像头采集驱动(DirectShow)
- Windows下摄像头采集驱动(DirectShow)
- XP下采用DirectShow采集摄像头
- XP下采用DirectShow采集摄像头
- XP下采用DirectShow采集摄像头
- opencv学习(七)(opencv3.0.0+VS2012+win7)打开摄像头并且进行边缘检测加上了滑动条
- opencv学习(十)(opencv3.0.0+VS2012+win7)打开摄像头并且进行人脸识别的例子
- DirectShow摄像头采集
- DirectShow摄像头采集
- OpenCV摄像头采集图像问题及DirectShow的使用
- opencv+directshow实现4个摄像头同步采集图像
- 基于DirectShow及Opencv的双摄像头显示(WIN7)
- opencv下摄像头的采集和保存
- USB摄像头采集图像(DirectShow)
- 搜索算法的感悟——解空间
- 力所能及之关于用JavaScript方式写ajax,post与get提交的注意区别
- 2843: 填空题A-"拍七"游戏
- QML基本可视化元素--TextEdit
- 异常的一些笔记
- win7下VS2012配置DirectShow+Opencv并且多摄像头采集
- 2844: 改错题A-看电影
- 安装vim插件 NeoComplete
- 尾递归
- 黑马程序员 JAVA基础学习笔记
- Codeforces Round #300(E,F 树状数组)
- extern “C”的用法解析
- 动态规划——Poj 1159 Palindrome
- El表达式运算符