2012-02-29 5 views
9

Có ai biết tại sao OpenCV 2 DescriptorMatcher::radiusMatch()knnMatch() lấy một số vector<vector<DMatch>>& matches? Tôi hơi bối rối vì sao nó không chỉ là một véc tơ, vì nó chỉ là một mảng điểm trong cảnh tương ứng với hình ảnh đào tạo, đúng không?OpenCV DescriptorMatcher radiusMatch và knnMatch result format

Tôi đã có một cái gì đó như thế này:

void getMatchingPoints(
    const vector<vector<cv::DMatch> >& matches, 
    const vector<cv::KeyPoint>& keyPtsTemplates, 
    const vector<cv::KeyPoint>& keyPtsScene, 
    vector<Vec2f>& ptsTemplate, 
    vector<Vec2f>& ptsScene 
    ) 
{ 
    ptsTemplate.clear(); 
    ptsScene.clear(); 

    for (size_t k = 0; k < matches.size(); k++) 
    { 
     for (size_t i = 0; i < matches[k].size(); i++) 
     { 
      const cv::DMatch& match = matches[k][i]; 
      ptsScene.push_back(fromOcv(keyPtsScene[match.queryIdx].pt)); 
      ptsTemplate.push_back(fromOcv(keyPtsTemplates[match.trainIdx].pt)); 
     } 
    } 
} 

nhưng tôi là một chút nhầm lẫn về làm thế nào để thực sự bản đồ xấp xỉ. vị trí của đối tượng khi tôi có tất cả trong ptsScene. Các điểm dường như phân tán cho tôi khi tôi chỉ vẽ chúng, vì vậy tôi nghĩ rằng tôi thiếu những vectơ lồng nhau đại diện.

Trả lời

23

Chức năng knnMatch sẽ trả lại k gần nhất-hàng xóm phù hợp, ví dụ: nếu bạn gọi knnMatch(queryDescriptors, trainDescriptors, matchesQueryToTrain, 3) nơi trong trường hợp này k=3, sau đó cho mỗi điểm đào tạo, nó sẽ tìm ra 3 trận đấu tốt nhất từ ​​các thiết lập truy vấn.

Về vector<vector<DMatch>> bạn, điều này có nghĩa là bên ngoài vector là một vector của mỗi query-> trận đấu tàu, và khu vực nội vector là một vector của k trận đấu gần nhất.

Có một ví dụ điển hình về cách sử dụng các đối sánh k này cùng với phương pháp kiểm tra chéo trong this câu hỏi khác.

Nếu bạn muốn kết hợp 1-1 đơn giản, bạn có thể gọi knnMatch với k = 1 sẽ trả lại vector bên trong có kích thước 1 hoặc chỉ gọi match kết quả khớp với dạng vector<DMatch> không có véc tơ thứ hai.

+1

rất kỹ lưỡng, cảm ơn rất nhiều! –