2013-04-05 5 views
7

Ich habe einen Code geschrieben, der die K besten Übereinstimmungen nach KNN-Algorithmus findet. Nachdem ich die MatMatch und MatchIndices erhalten habe, habe ich versucht, die Match-Paare zwischen zwei Folgerahmen zu zeichnen.Zeichnen von Match-Paaren im Bild - berechnet von KNN und der potentielle Fehler in Features2DToolbox.DrawMatches

Ich füttere matMask und matchIndices in Funktion Features2DToolbox.DrawMatches:

Image<Bgr, byte> imResult = Features2DToolbox.DrawMatches(imModelCurr, imModel.keyPoints, imObserPrev,imObser.keyPoints, **matchIndices**, new Bgr(System.Drawing.Color.Yellow), new Bgr(System.Drawing.Color.Red), **matMask**, Features2DToolbox.KeypointDrawType.NOT_DRAW_SINGLE_POINTS); 

http://www.emgu.com/wiki/files/2.4.0/document/html/e92d37e6-fe4a-ad09-9304-cd2d2533bfa8.htm aber ich merkte, es gibt mir wieder falsche Zeichnung zwischen passende Paare:

enter image description here

Dann habe ich versucht, eine solche Funktion zu implementieren n von mir:

for (int i = 0; i < matMask.Rows; ++i) 
     { 
      if (**matMask[i, 0]** > 0) 
      { 
       int indForCurrFrm = **matchIndices[i, 0]**; 
       int indForPrevFrm = i; 

       //for frame i-1 
       PointF fromFirstFrame = getImgObserved(keyPoints[indForPrevFrm]); 

       //for frame i 
       PointF NextCorrespondingMatchedFrame = getImModelXY(keyPoints[indForCurrFrm]); 

       imColorPrv2.Draw(new CircleF(fromFirstFrame, 5), new Bgr(mtchColor), 3);// for frame i-1 
       imColorShow.Draw(new CircleF(NextCorrespondingMatchedFrame, 5), new Bgr(mtchColor), 3); // for frame i 

       // draw line on my own matching 
       imResult.Draw(new LineSegment2DF(fromFirstFrame,NextCorrespondingMatchedFrame),new Bgr(System.Drawing.Color.FloralWhite),1); 

      } 
     } 

und holen das entsprechende Paar Punktkoordinaten (X, Y) und ziehen es selbst [die Ergebnisse in snapshot sehen].

Auf der linken Seite können Sie die Übereinstimmungen sehen (durch die weiße Linie dargestellt) und die entsprechenden Paare mit einem Kreis in der gleichen Farbe [durch meine eigene Funktion] und auf der anderen Seite unten rechts sind die Ergebnisse von DrawMatches funktionieren von Emgu. Beachten Sie, dass diese beiden Funktionen die gleichen MatMash- und MatchIndices verwenden.

Also ich frage mich, ob DrawMatches bei EMGU Fehler hat oder ich irgendwo falsch mache?

+0

Bitte weniger Punkte plotten, wie 10, ist es unmöglich, die Linien zu analysieren. Übrigens ist es seltsam, dass der rote Punkt vom Algorithmus nicht erkannt wurde. – Pedro77

Antwort

0

Es könnte sehr nützlich sein, die besten Übereinstimmungen von matchIndices zu filtern, wobei der euklidische Abstand zwischen den Deskriptoren für jedes entsprechende Paar verwendet wird. Manchmal kann ein Keypoin aus dem ersten Bild viele Keypoints aus dem zweiten Bild gut abgleichen, dies kann die gezeichneten Linien in den Ergebnissen verwechseln.

Filtering wie etwas sein könnte:

vector<DMatch> filtered_matches; 

for(int i = 0; i < descriptors_of_model.rows; i++) 
    { 
     if(matchIndices[i].distance < SMALL_THRESHOLD) 
      filtered_matches.push_back(matchIndices[i]); 

    }