CameraDS.h
上传用户:wjt888999
上传日期:2022-08-11
资源大小:5225k
文件大小:3k
源码类别:

OpenCV

开发平台:

Visual C++

  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. // 使用说明:
  11. //   1. 将CameraDS.h CameraDS.cpp以及目录DirectShow复制到你的项目中
  12. //   2. 菜单 Project->Settings->Settings for:(All configurations)->C/C++->Category(Preprocessor)->Additional include directories
  13. //      设置为 DirectShow/Include
  14. //   3. 菜单 Project->Settings->Settings for:(All configurations)->Link->Category(Input)->Additional library directories
  15. //      设置为 DirectShow/Lib
  16. //////////////////////////////////////////////////////////////////////
  17. #ifndef CCAMERA_H
  18. #define CCAMERA_H
  19. #define WIN32_LEAN_AND_MEAN
  20. #include <atlbase.h>
  21. #include "DirectShow/Include/qedit.h"
  22. #include "DirectShow/Include/dshow.h"
  23. #include <windows.h>
  24. #include <cxcore.h>
  25. #define MYFREEMEDIATYPE(mt) {if ((mt).cbFormat != 0)
  26. {CoTaskMemFree((PVOID)(mt).pbFormat);
  27. (mt).cbFormat = 0;
  28. (mt).pbFormat = NULL;
  29. }
  30. if ((mt).pUnk != NULL)
  31. {
  32. (mt).pUnk->Release();
  33. (mt).pUnk = NULL;
  34. }}
  35. class CCameraDS  
  36. {
  37. private:
  38. IplImage * m_pFrame;
  39. bool m_bConnected;
  40. int m_nWidth;
  41. int m_nHeight;
  42. bool m_bLock;
  43. bool m_bChanged;
  44. long m_nBufferSize;
  45. CComPtr<IGraphBuilder> m_pGraph;
  46. CComPtr<IBaseFilter> m_pDeviceFilter;
  47. CComPtr<IMediaControl> m_pMediaControl;
  48. CComPtr<IBaseFilter> m_pSampleGrabberFilter;
  49. CComPtr<ISampleGrabber> m_pSampleGrabber;
  50. CComPtr<IPin> m_pGrabberInput;
  51. CComPtr<IPin> m_pGrabberOutput;
  52. CComPtr<IPin> m_pCameraOutput;
  53. CComPtr<IMediaEvent> m_pMediaEvent;
  54. CComPtr<IBaseFilter> m_pNullFilter;
  55. CComPtr<IPin> m_pNullInputPin;
  56. private:
  57. bool BindFilter(int nCamIDX, IBaseFilter **pFilter);
  58. void SetCrossBar();
  59. public:
  60. CCameraDS();
  61. virtual ~CCameraDS();
  62. //打开摄像头,nCamID指定打开哪个摄像头,取值可以为0,1,2,...
  63. //bDisplayProperties指示是否自动弹出摄像头属性页
  64. //nWidth和nHeight设置的摄像头的宽和高,如果摄像头不支持所设定的宽度和高度,则返回false
  65. bool CCameraDS::OpenCamera(int nCamID, bool bDisplayProperties=true, int nWidth=320, int nHeight=240);
  66. //关闭摄像头,析构函数会自动调用这个函数
  67. void CloseCamera();
  68. //返回摄像头的数目
  69. //可以不用创建CCameraDS实例,采用int c=CCameraDS::CameraCount();得到结果。
  70. static int CameraCount(); 
  71. //根据摄像头的编号返回摄像头的名字
  72. //nCamID: 摄像头编号
  73. //sName: 用于存放摄像头名字的数组
  74. //nBufferSize: sName的大小
  75. //可以不用创建CCameraDS实例,采用CCameraDS::CameraName();得到结果。
  76. static int CCameraDS::CameraName(int nCamID, char* sName, int nBufferSize);
  77. //返回图像宽度
  78. int GetWidth(){return m_nWidth;} 
  79. //返回图像高度
  80. int GetHeight(){return m_nHeight;}
  81. //抓取一帧,返回的IplImage不可手动释放!
  82. //返回图像数据的为RGB模式的Top-down(第一个字节为左上角像素),即IplImage::origin=0(IPL_ORIGIN_TL)
  83. IplImage * QueryFrame();
  84. };
  85. #endif