2009-04-10 89 views
4

我正在嘗試將一些OpenCV功能集成到我的應用程序中。目前,我已經使用DirectShow設置了代碼,以便從我的相機獲取視頻饋送,然後將其顯示在MFC窗口中。此代碼不能更改或刪除。調用OpenCV方法時CoInitializeEx失敗cvLoadImage()

代碼運行完全正常,但無論位置我把下面的代碼行:

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

的網絡攝像頭無法正常初始化,並打破了計劃。

更直接,我終於找到失敗的HRESULT:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) 

更具體地講,在我的代碼某個時候我叫CDialog的:的DoModal(),然後打的CoInitializeEx(),從而使程序失敗。

有人會知道這裏發生了什麼嗎?

+0

失敗如何?最新的錯誤代碼? – 2009-04-10 05:22:40

回答

4

如果線程之前被初始化爲不同的公寓,也就是說,如果有一個以前的CoInitializeEx(NULL,COINIT_MULTITHREADED)

我猜想,OpenCV中調用的CoInitializeEx(NULL,COINIT_MULTITHREADED),導致您的CoInitialize將失敗隨後調用CoInitializeEx失敗。你可以通過檢查CoInitializeEx的返回值來確認 - 在這種情況下它將是RPC_E_CHANGED_MODE。

沒有簡單的修復方法,最簡單的方法就是將OpenCV調用移入單獨的線程。

1

除了Michael所說的檢查外部依賴DLL的情況外,如果缺少CoInitialize,也會失敗。

0

我有類似的問題。在我的MFC應用程序中,AfxOleInit的調用失敗,因爲RPC_E_CHANGED_MODE

我不能忽視失敗(我需要在應用程序內的COM),我不能將OpenCV調用移動到不同的線程(正如邁克爾所說的)。

我發現線程"wxwidgets and opencv 1.1 ole initialization error",解決了我的問題:我不需要來自OpenCV的視頻輸入的支持,所以我可以刪除#define HAVE_VIDEOINPUT 1http://tech.dir.groups.yahoo.com/group/OpenCV/message/60060

建議去_highgui.h,註釋行96(」 #define HAVE_VIDEOINPUT 1「) 並重新編譯

它與OpenCV_1.1pre1a一起使用。