关于opencv使用淘宝视频采集卡蓝屏的办法~

来源:互联网 发布:淘宝二手手机市场 编辑:程序博客网 时间:2024/04/29 06:28

最近使用淘宝上的三无视频采集卡(没办法只有三无货)做opencv开发,结果win10+3.1.0+vs2015蓝屏了……醉了

然后上网弄了好久才最终解决。现在总结一下,其实大部分具体方法也是网友提供的,我补充了一小部分,等会会给出参考网址

问题出在采集卡的驱动不兼容上,解决需要修改DirectShow的代码

1.配置DirectShow

VS2015是自带了DirectShowSDK 的,在 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include。

如果你有的话直接在项目属性里 Additional Include Directories 添加 $(FrameworkSDKDir)Include,Additional Library Directories 添加 $(FrameworkSDKDir)Lib。

2.使用CCameraDS类

在http://wiki.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

中下载压缩包,把相关代码加入工程。编译,你就会发现缺少qedit.h头文件!

3.关于qedit.h

因为DirectShow已经逐渐被抛弃,sdk不完整。在http://download.csdn.net/download/baidu_31147059/9441079下载qedit.h后加入工程。更不完整的东西在后面……你要

①将qedit.h中的“dxtrans.h" 和使用 "IDXEffect"的地方统统注释掉。

包括//#include "dxtrans.h" -- Line 498// IDxtCompositor //: public IDXEffect // IDxtAlphaSetter //: public IDXEffect // IDxtJpeg //: public IDXEffect // IDxtKey //: public IDXEffect ②在include <qedit.h>前面加上如下语句#define __IDxtCompositor_INTERFACE_DEFINED__#define __IDxtAlphaSetter_INTERFACE_DEFINED__#define __IDxtJpeg_INTERFACE_DEFINED__#define __IDxtKey_INTERFACE_DEFINED__#include "amstream.h"

4.iconfig接着会出问题,为null

解决:注释掉

else 
{
//////////////////////////////////////////////////////////////////////////////
// 加入由 lWidth和lHeight设置的摄像头的宽和高 的功能,默认320*240
// by flymanbox @2009-01-24
//////////////////////////////////////////////////////////////////////////////
IAMStreamConfig *iconfig = NULL;
hr = m_pCameraOutput->QueryInterface(IID_IAMStreamConfig, (void**)&iconfig);   


AM_MEDIA_TYPE *pmt;
if(iconfig->GetFormat(&pmt) !=S_OK)
{
printf("GetFormat Failed ! n");
return false;
}


// 3、考虑如果此时的的图像大小正好是 nWidth * nHeight,则就不用修改了。
if ((pmt->lSampleSize != (nWidth * nHeight * 3)) && (pmt->formattype == FORMAT_VideoInfo))
{
VIDEOINFOHEADER *phead = (VIDEOINFOHEADER*)(pmt->pbFormat);
phead->bmiHeader.biWidth = nWidth;
phead->bmiHeader.biHeight = nHeight;
if((hr = iconfig->SetFormat(pmt)) != S_OK)
{
return false;
}
}


iconfig->Release();
iconfig=NULL;
MYFREEMEDIATYPE(*pmt);
}

这一段

5.最后是最关键的,感谢http://www.ithao123.cn/content-853519.html

链接各个引脚,这个是能否打开easycap的关键,我们普通的usb摄像头只有一个输入引脚,而easycap不一样,它是集视频、音频一体的设备,那么输入设备的引脚选择就很重要了,你打开一个音频设备,却选择视频的方式,怎么可以打开?

关键代码:

CComPtr<IEnumPins> pEnum;
m_pDeviceFilter->EnumPins(&pEnum);
 hr = pEnum->Reset();
pEnum->Skip(2);//跳过非视频引脚
hr = pEnum->Next(1, &m_pCameraOutput, NULL);

我在这里跳过了两个引脚(具体几个自己多尝试一下),然后设置SetCrossBar(),顺利打开easycap摄像头。奋斗

附录:参考资料

http://www.ithao123.cn/content-853519.html

http://zhidao.baidu.com/question/288615517.html

http://wiki.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

http://bbs.csdn.net/topics/390208085

http://yekezhong.com/930/


p.s. 要想不限制视频长宽,把OpenCamera函数去掉后面参数



0 0
原创粉丝点击