Window7系统 opencv 利用DirectShow 进行视频采集的解决方案

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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值