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;

}

  

你可能感兴趣的:(window7)