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;
}
posted on 2011-09-19 16:01 DoubleSnake 阅读(7213) 评论(0) 收藏 举报
浙公网安备 33010602011771号