Window7系统 opencv 利用DirectShow 进行视频采集的解决方案
前几日,利用OpenCV读取摄像图像,结果打不开摄像头,所以很有必要整理一下.
代码:
// Opencv_DirectShow.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <iostream>
using
namespace
std;
#include "CameraDS.h"
//主题:vs2010 Opencv DirectShow 摄像头采集
//时间:2011.9.19
//简约说明:
// 1、网上下载qedit.h 地址:http://www.pudn.com/downloads127/sourcecode/graph/texture_mapping/detail539001.html
// 2、网上下载实例代码 地址:http://www.opencv.org.cn/index.php/%E4%BD%BF%E7%94%A8DirectShow%E9%87%87%E9%9B%86%E5%9B%BE%E5%83%8F
// 3、提取CameraDS.h .cpp 和qedit.h DShow.h ,并且添加到项目中
// 4、配置Opencv环境
// 5、运行成功
//
// 使用说明:(CameraDs的设计者)
// 1. 将CameraDS.h CameraDS.cpp以及目录DirectShow复制到你的项目中
// 2. 菜单 Project->Settings->Settings for:(All configurations)->C/C++->Category(Preprocessor)->Additional include directories
// 设置为 DirectShow/Include
// 3. 菜单 Project->Settings->Settings for:(All configurations)->Link->Category(Input)->Additional library directories
// 设置为 DirectShow/Lib
//开启摄像头,循环读取帧
IplImage *pFrame = 0 ;
//图片对象
const
char
* szTitle =
"Camera"
;
//窗口标题
int
_tmain(
int
argc, _TCHAR* argv[])
{
CCameraDS cameDS;
//类对象
//1、考虑到已经存在了显示图像的窗口,那就不必在此驱动摄像头了,一边往下驱动那也是摄像头已被占用
if
(IsWindowVisible(FindWindow(NULL,szTitle)))
{
return
-1;
}
cvNamedWindow(szTitle);
//创建窗口
int
iCamCount = CCameraDS::CameraCount();
//获取摄像头数目
cout<<
"There are "
<<iCamCount<<
" cameras."
<<endl;
//打印摄像头数量
for
(
int
i = 0 ; i < iCamCount ; i ++)
//获取所有摄像头的名称
{
char
szCamName[1024] ;
int
retval = cameDS.CameraName(i,szCamName,
sizeof
(szCamName));
if
(retval>0)
{
cout<<
"Camera "
<<i<<
" 's Name is "
<<szCamName <<
" ."
<<endl;
}
else
cout <<
"Can not get Camera "
<<i<<
" 's name."
<<endl;
}
//2、考虑到如果有多个摄像头,或者又有其中摸个或者莫几个正在被其他程序占有,故需要逐个遍历,知道找到可用的位置
int
iCamNum = 0 ;
//摄像头编号
while
(iCamNum < iCamCount)
{
if
((!cameDS.OpenCamera(iCamNum))||
((pFrame=cameDS.QueryFrame())==NULL))
{
iCamNum++;
}
else
break
;
//找到合适的摄像头,退出循环
//关闭摄像头,必须要关闭,因为即将要进行下一次的检测,检测前要清空当前的占用空间
cameDS.CloseCamera();
}
if
(iCamNum==iCamCount)
{
cout<<
"Can not open camera or is used by another app . "
<<endl;
return
-1;
}
while
(pFrame = cameDS.QueryFrame())
//读取一帧
{
cvShowImage(szTitle,pFrame);
//显示
int
c = cvWaitKey(20);
//获取按键
if
(c == 27 || c ==
'q'
)
//如果是退出 'esc' 'q'
{
break
;
}
}
//释放资源
cvDestroyAllWindows();
//关闭窗口 或者cvDestroyWindow(szTitle);
cameDS.CloseCamera();
//关闭摄像头 并且释放pFrame图像资源
return
0;
}
|