Nếu tôi hiểu bạn hỏi tôi một cách chính xác, tôi giả sử rằng bạn muốn keypoint phù hợp trong std::vector<cv::DMatch>
với mục đích lôi kéo họ với OpenCV cv::drawMatches
hoặc sử dụng với một số chức năng OpenCV tương tự. Kể từ khi tôi còn đang làm gì phù hợp với "bằng tay" thời gian gần đây, đây là mã của tôi mà đưa ra những trận đấu tùy ý chứa ban đầu tại một std::vector<std::pair <int, int> > aMatches
và hiển thị chúng trong một cửa sổ:
const cv::Mat& pic1 = img_1_var;
const cv::Mat& pic2 = img_2_var;
const std::vector <cv::KeyPoint> &feats1 = img_1_feats;
const std::vector <cv::KeyPoint> &feats2 = img_2_feats;
// you of course can work directly with original objects
// but for drawing you only need const references to
// images & their corresponding extracted feats
std::vector <std::pair <int, int> > aMatches;
// fill aMatches manually - one entry is a pair consisting of
// (index_in_img_1_feats, index_in_img_2_feats)
// the next code draws the matches:
std::vector <cv::DMatch> matches;
matches.reserve((int)aMatches.size());
for (int i=0; i < (int)aMatches.size(); ++i)
matches.push_back(cv::DMatch(aMatches[i].first, aMatches[i].second,
std::numeric_limits<float>::max()));
cv::Mat output;
cv::drawMatches(pic1, feats1, pic2, feats2, matches, output);
cv::namedWindow("Match", 0);
cv::setWindowProperty("Match", CV_WINDOW_FULLSCREEN, 1);
cv::imshow("Match", output);
cv::waitKey();
cv::destroyWindow("Match");
Ngoài ra, nếu bạn cần thông tin đầy đủ hơn về các trận đấu cho mục đích phức tạp hơn vẽ sau đó bạn cũng có thể muốn đặt khoảng cách giữa các kết quả khớp với một giá trị thích hợp. Ví dụ. nếu bạn muốn để tính toán khoảng cách sử dụng L2 khoảng cách, bạn nên thay thế các dòng sau:
for (int i=0; i < (int)aMatches.size(); ++i)
matches.push_back(cv::DMatch(aMatches[i].first, aMatches[i].second,
std::numeric_limits<float>::max()));
với điều này (lưu ý, cho đây là một tài liệu tham khảo tính năng vectơ mô tả cũng là cần thiết):
cv::L2<float> cmp;
const std::vector <std::vector <float> > &desc1 = img_1_feats_descriptors;
const std::vector <std::vector <float> > &desc2 = img_2_feats_descriptors;
for (int i=0; i < (int)aMatches.size(); ++i){
float *firstFeat = &desc1[aMatches[i].first];
float *secondFeat = &desc2[aMatches[i].second];
float distance = cmp(firstFeat, secondFeat, firstFeat->size());
matches.push_back(cv::DMatch(aMatches[i].first, aMatches[i].second,
distance));
}
Lưu ý rằng trong đoạn cuối, descX[i]
là một bộ mô tả cho featsX[i]
, mỗi phần tử của vector bên trong là một thành phần của vector mô tả. Ngoài ra, lưu ý rằng tất cả các vectơ mô tả phải có cùng một chiều.
Để tham khảo trong tương lai, bạn nên cố gắng làm cho câu hỏi của mình rõ ràng hơn. Tôi dựa trên ví dụ của tôi về "Tôi biết cặp nào sẽ đi cùng nhau" và "tiêu chuẩn :: vector". Nếu bạn cần giải thích thêm về câu trả lời, hãy cố gắng chính xác hơn với câu hỏi. –
penelope