Pass opencv inputarray und verwenden Sie es als std::vector
Ich möchten, schreiben Sie eine benutzerdefinierte Funktion, die die cv::InputArray als Parameter.
Innerhalb der Funktion, ich verstehen, ich kann über cv::InputArray::getMat erhalten einen header, der den Eingang cv::Mat.
Habe ich einige Verwirrungen, indem std::vector, um die cv::InputArray.
1.Wenn ich den pass std::vector in eine Funktion, kann ich immer noch den std::vector in der Funktion? Zum Beispiel:
void foo(cv::InputArray _input)
{
std::vector<cv::Point2f> input = _input.getVector() //getVector function doesn't exist
}
std::vector<cv::Point2f> a;
foo(a);
2.Wenn ich den pass std::vector, um die Funktion und Verwendung der getMat um eine cv::Mat in der Funktion, wie die Matte aussieht wie?
Poly hat eine klare Erklärung, die im Fall von std::vector<char>
. Was ist, wenn ich will std::vector<cv::Point2f>
in die Funktion, irgendwelche Vorschläge?
Dank sehr viel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie pass-Vektor an die Funktion, die
InputArray
Sie implizit Aufruf der Konvertierung KonstruktorInputArray::InputArray(vector)
. (Konvertierung Konstruktor ist hier erklärt: https://stackoverflow.com/a/15077788/928387)In diesem Konstruktor, der Vektor der Zeiger ist einfach zugewiesen
obj
member-variable in InputArray. Wenn Sie verwenden OpenCV 3.0, InputArray hat getObj () - Methode, so können Sie den vector durch die folgende Weise:Wenn Sie verwenden OpenCV 2.X, die Sie verwenden können
InputArray::getMat()
. Es gibtMat
Objekt, das einen Zeiger auf die Daten. So kann man den folgenden Weg als gut.Bezüglich deiner zweiten Frage, wenn Sie anrufen
InputArray::getMat()
auf InputArray Objekt mit N element gibt, gibt es (N*1) - matrix.Beachten Sie, dass
InputArray::getObj()
gibt das Objekt zurück, von wem es erstellt wurde. So casting nur funktioniert, wenn_input
wurde mit einemstd::vector
! Dies kann überprüft werden überInputArray::isVector()
.Sonst ein neues
std::vector
Objekt muss erstellt werden. Leider gibt es keine Möglichkeit zu sagen,std::vector
Verwendung bereits vorhandener Daten. Ich denke, es ist auch nicht möglich, wenn Sie mit Ihren eigenen Zuweisung. Wenn Sie wollen immer noch einestd::vector
, Pointer/Iteratoren (entweder in Konstruktor oder instd::vector::assign()
) erzeugen wir ein neues Objekt mit einer Kopie der Daten. Erhalten Sie die Größe direkt aus_input
überInputArray::Gesamt()
.Vektor
Basierend auf den bisherigen Beobachtungen, kombinierte ich die versuche vorgeschlagen Poly.
Vorlage
Zur Wiederverwendung von code für andere Typen, ich empfehlen die Verwendung von Vorlagen.
Weiteren sollten Sie prüfen, ob-Typen sind kompatibel, die über
InputArray::type()
.Arrays
Wenn Sie wollen einfach nur einfache Indizierung, man könnte natürlich die Verwendung von standard C-style-arrays (Hinweis, dass C++-Stil
std::array
muss auch zum kopieren von Daten).Dann können Sie Zugriff auf Daten über