【问题标题】:CoInitializeEx fails when calling OpenCV method cvLoadImage()调用 OpenCV 方法 cvLoadImage() 时 CoInitializeEx 失败
【发布时间】:2010-10-18 17:13:16
【问题描述】:

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

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

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

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

更直接地说,我在以下位置得到了 FAILED HRESULT:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)

更具体地说,在我的代码中,我调用了 CDialog::doModal(),然后调用 CoInitializeEx(),从而导致程序失败。

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

【问题讨论】:

  • 失败怎么办?错误代码是什么?
  • 我添加了一个我刚刚找到的更新,当我调用 CDialog::DoModal 时代码失败,无论 cvLoadImage 位于何处

标签: c++ windows mfc opencv directshow


【解决方案1】:

如果线程先前被初始化为不同的单元,则 CoInitialize 将失败,即如果之前存在 CoInitializeEx(NULL, COINIT_MULTITHREADED)

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

没有直接的解决方法,最直接的方法是将 OpenCV 调用移动到单独的线程中。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题。在我的 MFC 应用程序中,对 AfxOleInit 的调用以 RPC_E_CHANGED_MODE 失败。

      我不能忽略失败(我需要应用程序内的 COM),也不能将 OpenCV 调用移动到不同的线程(正如 Michael 正确建议的那样)。

      我发现线程 "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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        相关资源
        最近更新 更多