调用OpenCV方法时,CoInitializeEx失败cvLoadImage()

时间:2009-04-10 05:20:09

标签: c++ windows mfc opencv directshow

我正在尝试将一些OpenCV功能集成到我的应用程序中。目前我已经使用DirectShow设置代码以从我的相机获取视频,然后在MFC窗口中显示。此代码无法更改或删除。

代码运行完全正常,但无论位置如何,我都会放置以下代码行:

IplImage *img = cvLoadImage("C:/well.jpg");

网络摄像头无法正确初始化并破坏程序。

更直接地,我得到了一个FAILED HRESULT:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)

更具体地说,在我的代码中的某个时刻,我调用CDialog :: doModal(),然后命中CoInitializeEx(),从而使程序失败。

有人知道这里发生了什么吗?

3 个答案:

答案 0 :(得分:4)

如果线程先前已初始化为不同的公寓,则CoInitialize将失败,即,如果之前有CoInitializeEx(NULL,COINIT_MULTITHREADED)

我猜测OpenCV会调用CoInitializeEx(NULL,COINIT_MULTITHREADED),导致您对CoInitializeEx的后续调用失败。您可以通过检查CoInitializeEx的返回来确认这一点 - 在这种情况下它将是RPC_E_CHANGED_MODE。

没有简单的解决办法,最简单的方法是将OpenCV调用移动到一个单独的线程中。

答案 1 :(得分:1)

除了迈克尔所说的还检查外部依赖DLL,如果缺少一个,CoInitialize也会失败。

答案 2 :(得分:0)

我有类似的问题。在我的MFC应用中,AfxOleInit的来电失败,RPC_E_CHANGED_MODE

我无法忽略失败(我需要应用程序内部的COM)并且我无法将OpenCV调用移动到其他线程(正如迈克尔正确建议的那样)。

我发现线程"wxwidgets and opencv 1.1 ole initialization error"解决了我的问题:我不需要OpenCV的视频输入支持,所以我可以按http://tech.dir.groups.yahoo.com/group/OpenCV/message/60060

中的建议删除#define HAVE_VIDEOINPUT 1
  

转到_highgui.h,评论第96行(“#define HAVE_VIDEOINPUT 1”)   并重新编译

适用于OpenCV_1.1pre1a。