配置环境: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
#include "camerads.h"
#include
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;
}
当尝试用相同的方式去打开第三个摄像头的时候,程序便产生异常报错。
即当采用如下程序时,无法打开摄像头。
#include
#include "camerads.h"
#include
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;
}
#include
#include "camerads.h"
#include
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;
}
以上程序思路为:打开一个摄像头后,采集图像然后关闭该摄像头,接着再去打开另一个摄像头,另一个摄像头打开后采集完图像再关闭,然后再打开了第一个摄像头。
但是,摄像头采集的视频很卡,效果不好。
程序效果如下: