2012-05-26 4 views
10

Überall in features2D Klassen sehe ich Begriffe query und train. Zum Beispiel matches haben und queryIdx und Matchers haben train() Methode. Ich kenne die Definition der Wörter train und query in Englisch, aber ich kann die Bedeutung dieser Eigenschaften oder Methoden nicht verstehen.Was ist `query` und` train` in openCV features2D

P.S. Ich verstehe, dass es eine sehr dumme Frage ist, aber vielleicht liegt es daran, dass Englisch nicht meine Muttersprache ist.

Antwort

11

Sansuiso Antwort zu vervollständigen, nehme ich an, den Grund für diese Namen entschieden haben sollte in irgendeiner Anwendung, die wir bekommen haben eine Reihe von Bildern (Trainingsbildern) im voraus, beispielsweise 10 Bilder in Ihrem Büro genommen werden, dass. Die Merkmale können extrahiert werden, und die Merkmaldeskriptoren können für diese Bilder berechnet werden. Und zur Laufzeit wird dem System ein Bild gegeben, um die trainierte Datenbank abzufragen. Daher bezieht sich das Abfragebild auf dieses Bild. Ich mag wirklich nicht, wie sie diese Parameter benannt haben. Wenn Sie ein Paar Stereobilder haben und Sie die Merkmale anpassen möchten, sind diese Namen nicht sinnvoll, aber Sie müssen eine Konvention wählen, sagen Sie immer das linke Bild das Abfragebild und das rechte Bild als das Trainingsbild. Ich habe meinen Doktor in Computer Vision gemacht und einige Namenskonventionen in OpenCV scheinen mir sehr verwirrend/albern zu sein. Also, wenn Sie diese verwirrend oder albern finden, sind Sie nicht allein.

+5

Um es noch einfacher zu machen, Train ist das Bild, das Sie zuvor gelernt (extrahierte Features), Abfrage ist das Bild, das Sie mit den trainierten versuchen übereinstimmen. –

+0

Früher habe ich diese Dinge anders genannt: Ich nannte 'train' als' ethalon' und 'query' als' sample'. –

+1

@Shambool, ich habe eine Frage, scheint albern, aber mich sehr verwirrt. wenn ich 2 trainDescripters trainA und trainB in flann matcher für Zug setze. dann kommt das Query-Bild queryC, wird der Match-Algorithmus für trainA und trainB mit queryC ausgeführt? –

10
  • train: Diese Funktion baut den Klassifikator inneren Zustand, um es funktionsfähig zu machen. Denken Sie zum Beispiel an Training eine SVM, oder bauen Sie eine kd-Struktur aus den Referenzdaten. Vielleicht sind Sie verwirrt, weil dieser Schritt oft als Lernen in der Literatur bezeichnet wird.

  • query ist die Aktion, die nächsten Nachbarn zu einer Menge von Punkten zu finden, und durch Erweiterung bezieht sie sich auch auf die ganze Menge von Punkten, für die yo einen nächsten Nachbarn haben möchte. Erinnern Sie sich, dass Sie für die Nachbarn von 1 Punkt oder einer ganzen Menge im selben Funktionsaufruf fragen können (durch das Stapeln der Merkmalspunkte in einer Matrix).

  • trainIdx und queryIdx beziehen sich auf den Index von einem Pint in der Referenz/Abfrage festgelegt sind, dh Sie den Matcher für den nächsten Punkt fragen (an der trainIdx Position gespeichert) zu einem anderen Punkt (an der queryIdx Position gespeichert) . Nach dem Funktionsaufruf ist natürlich trainIdx bekannt. Wenn Ihre Punkte in einer Matrix gespeichert sind, ist der Index die Linie des berücksichtigten Merkmals.

+1

Diese Antwort macht deutlich, dass sich trainIdx und queryIdx auf den ersten bzw. zweiten (descriptor/keypoint) -Satz beziehen. –

+1

@GregKramida Ich denke, es ist anders herum. Wenn die Übereinstimmungen mit 'matcher.match (descriptors1, descriptors2, matches) 'erhalten werden, wird' queryIdx' in 'keypoints1' und' trainIdx' in 'keypoints2' indexieren. c.f. http://StackOverflow.com/a/13320083/2397253 – oarfish

+0

@Oarfish, ja, du hast Recht. Ich frage mich, ob ich den Kommentar entfernen sollte, damit es niemanden verwirrt. –

3

Ich verstehe, „Abfrage“ und „Zug“ in einem sehr naiv, aber nützliche Art und Weise: „Zug“: ein Daten oder ein Bild vorverarbeitet wird eine Datenbank „Abfrage“ zu bekommen: ein Eingabedaten oder Bild, die abgefragt werden in der Datenbank, die wir vorher trainiert haben. Hoffe es hilft dir auch.

+0

Das ist nicht naiv, das ist es. Oder wie es sein sollte ... Es bedeutet, dass ein einzelner Zugpunkt für mehr als einen Abfragepunkt zugewiesen werden kann. Außerdem können Sie alle Abfragepunkte zuweisen, aber einige Zugpunkte können niemals zugewiesen werden. – dividebyzero