2013-04-05 33 views
7

Tôi đã viết một mã mà nó tìm thấy K khớp gần nhất bằng thuật toán KNN. Sau khi nhận được matMatch và matchIndices, tôi đã cố gắng vẽ các cặp kết hợp giữa hai khung kết quả.Vẽ các cặp khớp trong tính toán hình ảnh của KNN và lỗi tiềm ẩn trong Features2DToolbox.DrawMatches

tôi ăn matMaskmatchIndices vào chức năng 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 nhưng tôi nhận thấy nó mang lại cho tôi vẽ lại sai giữa các cặp kết hợp:

enter image description here

Sau đó, tôi đã cố gắng để thực hiện như vậy functio n bởi bản thân mình:

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

      } 
     } 

và tìm tọa độ điểm cặp tương ứng (X, Y) và tự vẽ [xem kết quả trong ảnh chụp].

Một phía dưới bên trái bạn có thể thấy các kết quả phù hợp (được hiển thị bằng đường trắng) và mỗi cặp tương ứng với một vòng tròn cùng màu [theo chức năng của riêng tôi] và ở phía dưới cùng bên phải, đó là kết quả được vẽ bởi Hàm DrawMatches từ Emgu.Pay chú ý rằng hai hàm này sử dụng cùng một matMash và matchIndices.

Vì vậy, tôi đã tự hỏi nếu DrawMatches tại EMGU có lỗi hoặc tôi đang làm gì đó sai?

+0

Hãy vẽ điểm ít hơn, như 10, nó là không thể để phân tích các dòng. BTW, nó là kỳ lạ mà các dấu chấm màu đỏ đã không được công nhận bởi các thuật toán. – Pedro77

Trả lời

0

Có thể rất hữu ích khi lọc các kết quả phù hợp nhất từ ​​matchIndices, sử dụng khoảng cách euclide giữa các bộ mô tả của từng cặp tương ứng. Một số lần, một trong những điểm quan trọng từ hình ảnh đầu tiên có thể khớp với nhiều điểm chính từ hình ảnh thứ hai, điều này có thể làm lẫn lộn các đường vẽ trong kết quả.

Filtering có thể là một cái gì đó như:

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

    }