2009-04-10 15 views
4

Ich versuche, einige OpenCV-Funktionen in meine Anwendung zu integrieren. Momentan habe ich Code mit DirectShow eingerichtet, um einen Video-Feed von meiner Kamera zu erhalten, der dann in einem MFC-Fenster angezeigt wird. Dieser Code kann nicht geändert oder entfernt werden.CoInitializeEx schlägt beim Aufruf der OpenCV-Methode fehl. CvLoadImage()

Der Code läuft völlig in Ordnung, aber unabhängig von der Position platzieren i die folgende Codezeile:

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

Die Webcam richtig initialisiert wird und bricht das Programm ab.

mehr direkt, erhalte ich eine fehlgeschlagene HRESULT an:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) 

Insbesondere an einem gewissen Punkt in meinem Code nenne ich CDialog :: DoModal(), die dann CoInitializeEx Treffer() und macht damit die Programm fehlgeschlagen.

Würde jemand wissen, was hier vor sich geht?

+0

schlägt fehl, wie? Was ist der Fehlercode? –

+0

Ich habe ein Update hinzugefügt, das ich gerade gefunden habe, der Code schlägt fehl, wenn ich CDialog :: DoModal anrufe, unabhängig davon, wo sich cvLoadImage befindet – linusthe3rd

Antwort

4

CoInitialize fehlschlägt, wenn der Faden zuvor als eine andere Wohnung initialisiert wurde, das heißt, wenn es eine vorherige CoInitializeEx (NULL, COINIT_MULTITHREADED)

war ich würde vermuten, dass OpenCV CoInitializeEx (NULL, COINIT_MULTITHREADED) aufruft, Ihr verursacht nachfolgende Aufrufe von CoInitializeEx fehlschlagen. Sie können dies bestätigen, indem Sie die Rückgabe von CoInitializeEx überprüfen. In diesem Fall ist es RPC_E_CHANGED_MODE.

Es gibt keine einfache Lösung, die einfachste wird sein, die OpenCV-Aufrufe in einen separaten Thread zu verschieben.

1

Zusätzlich zu dem, was Michael sagte, überprüfen Sie auch für externe abhängige DLLs, wenn eines fehlt CoInitialize wird auch fehlschlagen.

0

Ich hatte ein ähnliches Problem. In meiner MFC-App ist der Anruf an AfxOleInit mit RPC_E_CHANGED_MODE fehlgeschlagen.

Ich kann den Fehler nicht ignorieren (ich brauche die COM in der App) und ich kann den OpenCV-Aufruf nicht zu einem anderen Thread verschieben (wie Michael zu Recht vorschlägt).

Ich fand den Faden "wxwidgets and opencv 1.1 ole initialization error", dass mein Problem löst: Ich brauche nicht den Videoeingang Unterstützung von OpenCV und so kann ich die #define HAVE_VIDEOINPUT 1 entfernen, wie in http://tech.dir.groups.yahoo.com/group/OpenCV/message/60060

zu _highgui.h gehen vorgeschlagen, Kommentarzeile 96 (“ #define HAVE_VIDEOINPUT 1 „) und

neu kompilieren mit OpenCV_1.1pre1a arbeitet.