2012-11-21 7 views
5

Ich habe ein C++ - Programm entwickelt, das OpenCV verwendet. Jetzt möchte ich eine Windows Form basierte Anwendung in C# entwickeln. Da C# nur verwalteten Code verarbeiten kann, ist es fast unmöglich, OpenCV direkt in C# auszuführen. Ich habe nach verschiedenen Möglichkeiten gesucht, C# -Anwendung mit OpenCV zu erstellen, eine davon ist EmguCV und die andere Methode, die ich viel mehr interessiert ist Importieren der C++ - DLL-Datei in C# -Anwendung und Aufruf der nicht verwalteten Funktionen auf diese Weise.Aufruf von opencv C++ - Code in C# -Anwendung

Ich begann mit dem Erstellen von einfachen Funktionen in C++ und ich konnte cout und cin in meiner C# -Anwendung durch Importieren der DLL verwenden. Das Problem kommt, wenn ich versuche zu OpenCV-Header-Dateien in meiner C++ Anwendung umfassen und wenn ich ich diesen Fehler kompilieren erhalten

Fehler LNK1104: Datei kann nicht geöffnet ‚tbb_debug.lib‘

Irgend jemand getan hat dies vor, aber ich kann nicht herausfinden, wie er C-Schnittstelle ++ mit C# in Displaying webcam feed in cv::Mat format in a picturebox

die Frage ist, dass ich Funktion haben, die in einem cv :: Mat Variable und führt einige Bildverarbeitung auf sie und gibt die verarbeiteten Matrix nimmt. Ich möchte diese Funktion in C++ in meiner C# -Anwendung geschrieben verwenden. aber das Problem ist, dass ich die DLL nicht erstellen kann, wenn ich OpenCV-Bibliothek in C++ einschließe.

Also bitte nicht vorschlagen, EmguCV oder andere .NET Wrapper für OpenCV zu verwenden.

Ich verwende Visual Studio 2010 für mein Projekt.

+0

Was ist die Frage? Sie haben bereits erwähnt, dass Sie eine DLL erstellen und auf diese über P/Invoke zugreifen können. Sie können auch C++/CLI verwenden, um eine Assembly zu schreiben, die auf native Header zugreift und native Bibliotheken verwendet. Was den Linkfehler angeht, haben Sie nicht genügend Informationen zur Verfügung gestellt, um zu sagen, was falsch ist. – Spook

+0

Ich habe den Beitrag bearbeitet, wenn ich versuche, eine Methode zu schreiben, die OpenCV verwendet, bekomme ich einen Fehler, den ich oben geschrieben habe, so dass die DLL nicht erstellt werden kann, aber wenn ich nur Cout und Cin kein Fehler kam und die DLL erfolgreich erstellt wurde –

Antwort

3

Ich würde Methoden explizit exportieren, die Ihre Eintrittspunkte in einem C++ Header-wickeln, und verwenden Sie dann P/Invoke sie verweisen:

extern "C" __declspec(dllexport) BOOL DoSomething(); 

verbrauchen sie dann in der C#:

[DllImport("MyOpenCVWrapper.dll")] 
private static extern bool DoSomething(); 

Ich würde nicht versuchen, die OpenCV-Header zu referenzieren.

+0

Vielen Dank. es hat mein Problem gelöst. –

1

Obwohl es möglicherweise nicht das ist, was Sie suchen, habe ich diese Aufgabe mit C++/CLI gemacht und es durch eine Baugruppe ausgesetzt. Es war einfach und funktionierte ziemlich gut. Blog article here.