2012-11-21 17 views
5

Ho sviluppato un programma C++ che utilizza OpenCV. Ora voglio sviluppare un'applicazione basata su Windows form in C#. Siccome C# può gestire solo il codice gestito, è quasi impossibile eseguire OpenCV direttamente sull'applicazione C#. Ho cercato diversi modi per creare un'applicazione C# usando OpenCV, uno dei quali è EmguCV e l'altro metodo a cui sono molto più interessato è importare il file C++ .dll nell'applicazione C# e chiamare le funzioni non gestite in questo modo.chiamata codice opencv C++ nell'applicazione C#

Ho iniziato creando semplici funzioni in C++ e sono stato in grado di utilizzare cout e cin nella mia applicazione C# importando la dll. Il problema nasce quando provo ad includere file di intestazione OpenCV nella mia applicazione C++ e quando compilo ottengo questo errore

errore LNK1104: Impossibile aprire il file 'tbb_debug.lib'

Qualcuno ha fatto prima, ma i cant capire come egli interfacciarsi C++ con C# nella Displaying webcam feed in cv::Mat format in a picturebox

la questione è che ho funzione che prende in un cv :: variabile Mat ed esegue qualche elaborazione immagine su di essa e restituisce la matrice elaborata. Voglio usare quella funzione scritta in C++ nella mia applicazione C#. ma il problema è che non riesco a creare la DLL quando includo la libreria OpenCV in C++.

Quindi, per favore, non mi suggerisce di utilizzare EmguCV o qualsiasi altro wrapper .NET per OpenCV.

sto usando Visual Studio 2010 per il mio progetto.

+0

Qual è la domanda? Hai già detto che puoi creare una DLL e accedervi tramite P/Invoke. È anche possibile utilizzare C++/CLI per scrivere un assembly, che accede a intestazioni native e utilizza librerie native. Per quanto riguarda l'errore di collegamento, non hai fornito informazioni sufficienti per dirci, cosa è sbagliato. – Spook

+0

ho modificato il post, quando provo a scrivere qualsiasi metodo che usi OpenCV ottengo un errore che ho postato sopra in modo che la dll non possa essere creata ma quando ho usato solo cout e cin non si è verificato alcun errore e la dll è stata creata con successo –

risposta

3

Vorrei esportare esplicitamente metodi che avvolgono i vostri punti di ingresso in un C++ di testa, e quindi utilizzare P/Invoke fare riferimento a loro:

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

Poi li consumano in C#:

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

Non proverei a fare riferimento alle intestazioni OpenCV.

+0

Grazie mille. ha risolto il mio problema. –

1

Anche se potrebbe non essere quello che stai cercando, l'ho fatto con C++/CLI e l'ho esposto attraverso un assembly. Era semplice e funzionava abbastanza bene. Blog article here.