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) 编辑 收藏 举报