Ошибка CoInitializeEx при вызове метода OpenCV cvLoadImage () - PullRequest
4 голосов
/ 10 апреля 2009

Я пытаюсь интегрировать некоторые функции OpenCV в мое приложение. В настоящее время у меня есть код, настроенный с помощью DirectShow для получения видеопотока с моей камеры, который затем отображается в окне MFC. Этот код не может быть изменен или удален.

Код работает полностью нормально, но независимо от местоположения я помещаю следующую строку кода:

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

Веб-камера не может правильно инициализироваться и не работает с программой.

точнее, я получаю НЕПРАВИЛЬНЫЙ HRESULT по адресу:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)

Более конкретно, в какой-то момент в моем коде я вызываю CDialog :: doModal (), который затем вызывает CoInitializeEx () и, таким образом, вызывает сбой программы.

Кто-нибудь знает, что здесь происходит?

Ответы [ 3 ]

4 голосов
/ 10 апреля 2009

CoInitialize завершится ошибкой, если поток ранее был инициализирован как другая квартира, т. Е. Был предыдущий CoInitializeEx (NULL, COINIT_MULTITHREADED)

Я бы предположил, что OpenCV вызывает CoInitializeEx (NULL, COINIT_MULTITHREADED), что приводит к сбою ваших последующих вызовов CoInitializeEx. Вы можете подтвердить это, проверив возврат CoInitializeEx - в этом случае это будет RPC_E_CHANGED_MODE.

Простого решения не существует, самым простым будет переместить вызовы OpenCV в отдельный поток.

1 голос
/ 10 апреля 2009

В дополнение к тому, что сказал Майкл, проверьте также наличие внешних зависимых библиотек DLL, если один из них отсутствует, CoInitialize также не будет работать.

0 голосов
/ 19 июля 2012

У меня была похожая проблема. В моем приложении MFC вызов AfxOleInit завершился неудачно с RPC_E_CHANGED_MODE.

Я не могу игнорировать ошибку (мне нужен COM внутри приложения), и я не могу переместить вызов OpenCV в другой поток (как справедливо предлагает Майкл).

Я нашел поток "Ошибка инициализации ox wwwidgets и opencv 1.1" , который решает мою проблему: мне не нужна поддержка ввода видео из OpenCV, поэтому я могу удалить #define HAVE_VIDEOINPUT 1, как предложено в http://tech.dir.groups.yahoo.com/group/OpenCV/message/60060

перейти к _highgui.h, строка комментария 96 ("#define HAVE_VIDEOINPUT 1") и перекомпилировать

Работает с OpenCV_1.1pre1a.

...