opencv学习笔记(二十二)——驱动双摄像头

问题描述:

驱动双目摄像头——这是我研究双目视觉系统的第一步,俗话说万事开头难,我这第一步搞得真是头破血流啊,终于在我百般努力下驱动起这个双目摄像头了。在驱动的过程中,我发现当我们驱动多个摄像头时,opencv传统的摄像头驱动方式只能同时打开型号不同的摄像头(例如电脑内置摄像头和USB外置摄像头),而驱动两个相同的摄像头(也就是我使用的双目摄像头)时,我们在程序中打开的第一个摄像头能够正常运行,而第二个打开的摄像头无法开启。这就是纠结了我N久的一个问题。
发现问题后,立即上网查询资料,发现的解决方案有两种:
一种是采用逆序打开摄像头(经过实际测试,该方法无效);另一种就是于仕琪老师提供的DirectShow视频采集方案,老师介绍写得很详细,我就不多说,不过老师操作写得太简约,新手可能不好理解,我在这里完善一下,顺带提一下我驱动过程中遇到的一些”非人类”的问题,以供遇到相同问题的新手学习。

实际操作:

驱动双目摄像头的过程中需要的文件有:
(1)directshow,(2)CCameraDs, (3)quedit.h和stdafx.h
我已经将这些打包好了,可以在这里下载:
http://download.csdn.net/detail/hx1298234467/9394817

(2)新建一个工程,将下载的文件放到工程目录下,在DirectShow中的lib文件中含有X86和X64两个文件夹,根据自己电脑选一个,并将其文件夹中的.lib文件放到lib文件,如:

opencv学习笔记(二十二)——驱动双摄像头_第1张图片
opencv学习笔记(二十二)——驱动双摄像头_第2张图片
(3)然后配置工程:

  • 属性->VC++目录->包含目录->编辑,将DirectShow中的Includ路径添加进去,如:

opencv学习笔记(二十二)——驱动双摄像头_第3张图片

  • 属性->VC++目录->库目录->编辑,将DirectShow中的LIB文件夹添加进去,如:

opencv学习笔记(二十二)——驱动双摄像头_第4张图片

工程就这样配置完成了,但是会出现很多错误,下面我们来逐一解决这些错误。

消除报错:

  • 错误一:
    ./../../winnt.h(222) : error C2146: syntax error : missing ‘;’ before identifier ‘PVOID64’
    解决方案:
    可以改写 winnt.h 中的代码,在下面这两行:
    typedef void *PVOID;
    typedef void *POINTER_64 PVOID64;
    之前增加一行: #define POINTER_64 __ptr64

  • 错误二:
    错误 2
    error C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    解决方案:关闭安全检查,加上#define _CRT_SECURE_NO_WARNINGS

  • 错误三:
    错误 21 error LNK1120: 19 个无法解析的外部命令 F:\Work\opencv\opencv2.0\双目视觉系统\x64\Debug\双目视觉系统.exe 双目视觉系统
    错误 15 error LNK2001: 无法解析的外部符号 CLSID_CaptureGraphBuilder2 F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 16 error LNK2001: 无法解析的外部符号 CLSID_FilterGraph F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 10 error LNK2001: 无法解析的外部符号 CLSID_NullRenderer F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 9 error LNK2001: 无法解析的外部符号 CLSID_SampleGrabber F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 17 error LNK2001: 无法解析的外部符号 CLSID_SystemDeviceEnum F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 18 error LNK2001: 无法解析的外部符号 CLSID_VideoInputDeviceCategory F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 19 error LNK2001: 无法解析的外部符号 FORMAT_VideoInfo F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 7 error LNK2001: 无法解析的外部符号 IID_IAMCrossbar F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 6 error LNK2001: 无法解析的外部符号 IID_IAMStreamConfig F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 3 error LNK2001: 无法解析的外部符号 IID_IBaseFilter F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 5 error LNK2001: 无法解析的外部符号 IID_ICaptureGraphBuilder2 F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 2 error LNK2001: 无法解析的外部符号 IID_ICreateDevEnum F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 4 error LNK2001: 无法解析的外部符号 IID_IGraphBuilder F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 11 error LNK2001: 无法解析的外部符号 IID_IMediaControl F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 12 error LNK2001: 无法解析的外部符号 IID_IMediaEvent F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 8 error LNK2001: 无法解析的外部符号 IID_ISampleGrabber F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 20 error LNK2001: 无法解析的外部符号 LOOK_UPSTREAM_ONLY F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 14 error LNK2001: 无法解析的外部符号 MEDIASUBTYPE_RGB24 F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    错误 13 error LNK2001: 无法解析的外部符号 MEDIATYPE_Video F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\CameraDS.obj 双目视觉系统
    警告 1 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 F:\Work\opencv\opencv2.0\双目视觉系统\双目视觉系统\DirectShow\Include\uuids.h 1 1 双目视觉系统

解决方案:
这个问题也是困扰我最久的问题,我在这里说明一下,网上流传的基于DirectShow驱动多个摄像头的方案里提供的DirectShow的lib文件多数都是32位的,如果你的电脑是64位的无法识别DirectShow的库就会报这些错误。所以选择一个正确的lib库就能避免这些库。

你可能感兴趣的:(opencv)