分享

OpenCV摄像头采集图像问题及DirectShow的使用

 Y忍冬草 2016-09-21

1L 1L (2)


在用OpenCV打开USB摄像头时,分别用两个软件采集图像结果是上面两幅,第一幅我是用OpenCV采集的,第二幅是用别人的软件采集的,感觉颜色上差异好大啊,在OpenCV感觉无法设置摄像头本身的许多属性,造成这样的原因我个人以为是两个软件用不同的库,其默认的采集图像的参数不一样,所以想用DirectShow,据说里面有一些设置属性的东西。


安装DirectShow

1、下载安装及配置OpenCV

2、下载DirectShow免费的,哈哈(http://download.csdn.net/detail/b5w2p0/5279121)

3、解压到OpenCV所在的文件夹。

4、VS2010新建Win32工程,空文档。

5、配置OpenCV(其他文章有很多这里就不说了)。

6、配置DirectShow:在属性管理器中,在VC++目录中include这一项中添加DirectShow下include文件路径。

                                   在Library中添加DirectShow下lib路径。                             

7、将CameraDS.h CameraDS.cpp以及目录DirectShow复制到你的项目中

http://www./index.php/%E4%BD%BF%E7%94%A8DirectShow%E9%87%87%E9%9B%86%E5%9B%BE%E5%83%8F#.E4.B8.8B.E8.BD.BD

这个路径里有你要的试验程序。也可以下载到 CameraDS.h CameraDS.cpp。

8、需要的话在属性管理器中 常规下,将使用unicode字符集改成未设置,这样可以避免一些编译错误。

//////////////////////////////////////////////////////////////////////+
// Video Capture using DirectShow
// Author: Shiqi Yu (shiqi.yu@gmail.com)
// Thanks to:
//		HardyAI@OpenCV China
//		flymanbox@OpenCV China (for his contribution to function CameraName, and frame width/height setting)
// Last modification: April 9, 2009
//
// 使用说明:
//   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
//////////////////////////////////////////////////////////////////////

#include <stdio.h>

#include "CameraDS.h"

#include <highgui.h>

const char *g_szTitle = "Camera";

int main()
{
  // 1、考虑到已经存在了显示图像的窗口,那就不必再次驱动摄像头了,即便往下驱动那也是摄像头已被占用。
  if(IsWindowVisible(FindWindow(NULL, g_szTitle)))
  {
    return (-1);
  }

  //仅仅获取摄像头数目
  int m_iCamCount = CCameraDS::CameraCount();
  printf("There are %d cameras.\n", m_iCamCount);

  if(m_iCamCount == 0)
  {
    return (-1);
  }

  CCameraDS m_CamDS;

  //获取所有摄像头的名称
  for(int i = 0; i < m_iCamCount; i++)
  {
    char szCamName[1024];

    int retval = m_CamDS.CameraName(i, szCamName, sizeof(szCamName));

    if(retval >0)
    {
      printf("Camera #%d's Name is '%s'.\n", i, szCamName);
    }
    else
    {
      printf("Can not get Camera #%d's name.\n", i);
    }
  }

  // 2、考虑到如果有多个摄像头,或者又有其中某个或某几个正在被其它程序占有,故需要逐个遍历,
  // 直到找到可用的为止。
  int m_iCamNum = 0; // 摄像头编号

  IplImage *pFrame = NULL;

  while(m_iCamNum < m_iCamCount)
  {
    if((! m_CamDS.OpenCamera(m_iCamNum, true , 320, 240)) || ((pFrame = m_CamDS.QueryFrame()) == NULL))
    {
      m_iCamNum++;
    }
    else
    { // 找到合适的摄像头,退出循环。
      break;
    }

    // 关闭摄像头,必须要关闭,因为即将要进行下一次的检测,检测前要清空当前的占用空间。
    m_CamDS.CloseCamera();
  }

  if(m_iCamNum == m_iCamCount)
  {
    fprintf(stderr, "Can not open camera or is used by another app.\n");

    return (-1);
  }

  cvNamedWindow(g_szTitle);
  //显示
  cvShowImage(g_szTitle, pFrame);

  while(1)
  {
    //获取一帧
    pFrame = m_CamDS.QueryFrame();

    //显示
    cvShowImage(g_szTitle, pFrame);

    if (cvWaitKey(20) == 'q')
    {
      break;
    }
  }

  m_CamDS.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头

  cvDestroyWindow(g_szTitle);

  return 0;
}
9、这里我跳出了摄像头的属性设置页,没有我要的属性,还是没有达到我的效果,采集的图像还是像第一张,纠结啊!看来还有好长的路要走。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多