2013-04-05 15 views
7

KNN algoritması tarafından K en yakın eşleşmeleri bulduğu bir kod yazdım. MatMatch ve matchIndices'i aldıktan sonra, iki sonuç karesi arasındaki eşleşme çiftlerini çizmeye çalıştım.KNN tarafından görüntü tarafından hesaplanan resim eşleştirmeleri ve olası hata, Features2DToolbox.DrawMatches

ben işlevi içine Features2DToolbox.DrawMatchesmatMask ve matchIndices beslemek:

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 ama beni eşleşen çiftler arasında geriye yanlış çizim verir fark:

enter image description here

O zaman böyle bir fonksiyonu uygulamaya çalıştım başıma N:

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); 

      } 
     } 

ve karşılık gelen bir çift nokta koordinatları (x, y) almak ve başıma çizin [bir anlık sonuçları bakınız].

Sol altta, (beyaz çizgiyle gösterilen) eşleşmeleri ve her bir eşyi aynı renkteki bir daireyle [kendi İşlevim] ve diğer sağ altta görebiliyordunuz. DrawMatches işlevi Emgu'dan çalışır. Bu iki fonksiyonun aynı matMash ve matchIndices kullanmasına dikkat edin.

EMGU’da DrawMatches’in hata yapıp yapmadığını mı yoksa yanlış bir yerde mi çalıştığımı merak ediyordum.

+0

10 gibi, daha az puan çizdirmek Lütfen, satırları analiz etmek mümkün değildir. BTW, kırmızı noktanın algoritma tarafından tanınmaması tuhaf. – Pedro77

cevap

0

Karşılık gelen her çiftin tanımlayıcıları arasındaki öklid mesafesini kullanarak matchIndices arasındaki en iyi eşleşmeleri filtrelemek çok yararlı olabilir. Bazı durumlarda ilk görüntüdeki bir anahtar nokta, ikinci görüntüdeki birçok anahtar noktayı eşleştirebilir, bu da sonuçta çizilen çizgilerin sonuçlarını karıştırır.

Filtreleme gibi bir şey olabilir:

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]); 

    } 
İlgili konular