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

1L1L (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.opencv.org.cn/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字符集改成未设置,这样可以避免一些编译错误。

 

  1. //////////////////////////////////////////////////////////////////////+  
  2. // Video Capture using DirectShow  
  3. // Author: Shiqi Yu (shiqi.yu@gmail.com)  
  4. // Thanks to:  
  5. //      HardyAI@OpenCV China  
  6. //      flymanbox@OpenCV China (for his contribution to function CameraName, and frame width/height setting)  
  7. // Last modification: April 9, 2009  
  8. //  
  9. // 使用说明:  
  10. //   1. 将CameraDS.h CameraDS.cpp以及目录DirectShow复制到你的项目中  
  11. //   2. 菜单 Project->Settings->Settings for:(All configurations)->C/C++->Category(Preprocessor)->Additional include directories  
  12. //      设置为 DirectShow/Include  
  13. //   3. 菜单 Project->Settings->Settings for:(All configurations)->Link->Category(Input)->Additional library directories  
  14. //      设置为 DirectShow/Lib  
  15. //////////////////////////////////////////////////////////////////////  
  16.   
  17. #include <stdio.h>  
  18.   
  19. #include "CameraDS.h"  
  20.   
  21. #include <highgui.h>  
  22.   
  23. const char *g_szTitle = "Camera";  
  24.   
  25. int main()  
  26. {  
  27.     // 1、考虑到已经存在了显示图像的窗口,那就不必再次驱动摄像头了,即便往下驱动那也是摄像头已被占用。  
  28.     if(IsWindowVisible(FindWindow(NULL, g_szTitle)))  
  29.     {  
  30.         return (-1);  
  31.     }  
  32.   
  33.     //仅仅获取摄像头数目  
  34.     int m_iCamCount = CCameraDS::CameraCount();  
  35.     printf("There are %d cameras.\n", m_iCamCount);  
  36.   
  37.     if(m_iCamCount == 0)  
  38.     {  
  39.         return (-1);  
  40.     }  
  41.   
  42.     CCameraDS m_CamDS;  
  43.   
  44.     //获取所有摄像头的名称  
  45.     for(int i = 0; i < m_iCamCount; i++)  
  46.     {  
  47.         char szCamName[1024];  
  48.   
  49.         int retval = m_CamDS.CameraName(i, szCamName, sizeof(szCamName));  
  50.   
  51.         if(retval >0)  
  52.         {  
  53.             printf("Camera #%d's Name is '%s'.\n", i, szCamName);  
  54.         }  
  55.         else  
  56.         {  
  57.             printf("Can not get Camera #%d's name.\n", i);  
  58.         }  
  59.     }  
  60.   
  61.     // 2、考虑到如果有多个摄像头,或者又有其中某个或某几个正在被其它程序占有,故需要逐个遍历,  
  62.     // 直到找到可用的为止。  
  63.     int m_iCamNum = 0; // 摄像头编号  
  64.   
  65.     IplImage *pFrame = NULL;  
  66.   
  67.     while(m_iCamNum < m_iCamCount)  
  68.     {  
  69.         if((! m_CamDS.OpenCamera(m_iCamNum, true , 320, 240)) || ((pFrame = m_CamDS.QueryFrame()) == NULL))  
  70.         {  
  71.             m_iCamNum++;  
  72.         }  
  73.         else  
  74.         { // 找到合适的摄像头,退出循环。  
  75.             break;  
  76.         }  
  77.   
  78.         // 关闭摄像头,必须要关闭,因为即将要进行下一次的检测,检测前要清空当前的占用空间。  
  79.         m_CamDS.CloseCamera();  
  80.     }  
  81.   
  82.     if(m_iCamNum == m_iCamCount)  
  83.     {  
  84.         fprintf(stderr, "Can not open camera or is used by another app.\n");  
  85.   
  86.         return (-1);  
  87.     }  
  88.   
  89.     cvNamedWindow(g_szTitle);  
  90.     //显示  
  91.     cvShowImage(g_szTitle, pFrame);  
  92.   
  93.     while(1)  
  94.     {  
  95.         //获取一帧  
  96.         pFrame = m_CamDS.QueryFrame();  
  97.   
  98.         //显示  
  99.         cvShowImage(g_szTitle, pFrame);  
  100.   
  101.         if (cvWaitKey(20) == 'q')  
  102.         {  
  103.             break;  
  104.         }  
  105.     }  
  106.   
  107.     m_CamDS.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头  
  108.   
  109.     cvDestroyWindow(g_szTitle);  
  110.   
  111.     return 0;  
  112. }  


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

posted @ 2014-05-08 11:13  视界君  阅读(3050)  评论(0)    收藏  举报