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  阅读(7090)  评论(0编辑  收藏  举报