2015-08-04 15 views
9

In der Dokumentation gibt es zum Beispiel:Sind "InputArray" und "Mat" in opencv gleich?

void cv::absdiff ( InputArray  src1, 
     InputArray  src2, 
     OutputArray  dst 
    ) 

Ist das das gleiche wie:

void cv::absdiff ( Mat  src1, 
      Mat  src2, 
      Mat  dst 
     ) 

oder:

void cv::absdiff ( Mat* src1, 
      Mat* src2, 
      Mat* dst 
     ) 

?

Ich brauche diese

zum Beispiel neue Funktion zu erstellen
void absDiffSay(XXX src1, XXX src2, XXX dst) 
{ 
    cv::absdiff(src1,src2,dst); 
    cout<<"absdiff"<<endl; 
} 

Antwort

16

Von OpenCV doc

Dies ist die Proxy-Klasse ist Arrays in OpenCV Funktionen Eingang schreibgeschützt für das Bestehen. Es ist definiert als:

typedef const _InputArray& InputArray; 

wo _InputArray eine Klasse ist, die aus Mat konstruiert werden kann, Mat_<T>, Matx<T, m, n>, std::vector<T>, std::vector<std::vector<T> > oder std::vector<Mat>. Es kann auch aus einem Matrixausdruck konstruiert werden.

Da es sich hauptsächlich um die Klasse der Implementierungsklasse handelt und deren Schnittstelle sich in zukünftigen Versionen ändern kann, beschreiben wir sie nicht im Detail. Es gibt ein paar wichtigen Dinge, obwohl, die im Auge behalten werden sollen:

Wenn Sie im Referenz-Handbuch oder in OpenCV Source-Code eine Funktion, die InputArray nimmt, bedeutet dies, dass Sie tatsächlich Mat passieren können, Matx, vector<T> usw. (siehe oben die vollständige Liste).

Optionale Eingabeargumente: Wenn einige der Eingabearrays möglicherweise leer sind, übergeben Sie cv::noArray() (oder einfach cv::Mat(), wie Sie wahrscheinlich zuvor getan haben). Die Klasse ist ausschließlich zum Übergeben von Parametern vorgesehen. Das heißt, normalerweise sollten Sie keine Klassenmitglieder, lokale und globale Variablen dieses Typs deklarieren. Wenn Sie eine eigene Funktion oder eine Klassenmethode entwerfen möchten, die mit Arrays verschiedener Typen arbeiten kann, können Sie InputArray (oder OutputArray) für die jeweiligen Parameter verwenden. Innerhalb einer Funktion sollten Sie die Methode _InputArray::getMat() verwenden, um einen Matrix-Header für das Array zu erstellen (ohne Daten zu kopieren). _InputArray::kind() kann verwendet werden, um Mat von vector<> usw. zu unterscheiden, aber normalerweise wird es nicht benötigt.

Also, wenn Sie benötigen Sie, dass Ihre Funktion sowohl InputArraycv::Mat und std::vector<> Verwendung annehmen können, sonst einfach verwenden cv::Mat.

Sicher nichtMat* verwenden.

+0

http://wklej.org/id/1768648/ Wird es funktionieren? – user3191398

+1

Ja, verwenden Sie Const Mat & als Eingaben und Sie vermeiden, sogar die Kopfzeile von Mats zu kopieren. Sie können auch dst als Argument als Mat & setzen und void zurückgeben – Miki

+0

Sehr detaillierte Antwort. –