2012-03-15 35 views
7

Đây là vấn đề của tôi. Tôi đã tự trích xuất các tính năng điểm chính với SURF trên nhiều hình ảnh. Nhưng tôi cũng đã biết cặp điểm nào sẽ phù hợp. Vấn đề là, tôi đang cố gắng để tạo ra cặp kết hợp của tôi, nhưng tôi không hiểu làm thế nào. Tôi đã thử bằng cách nhìn vào mã, nhưng đó là một mớ hỗn độn.Đặt thủ công kết hợp theo cặp trong OpenCV từ các điểm chính của tính năng

Ngay bây giờ, tôi biết rằng kích thước của các feature.descriptors, một ma trận, giống như số lượng điểm chính (thứ nguyên khác là 1). Trong mã, để phát hiện các cặp phù hợp, nó chỉ sử dụng các bộ mô tả, vì vậy nó so sánh các hàng (hoặc các cột, tôi không chắc chắn) hoặc hai ma trận mô tả và xác định nếu có gì chung.

Nhưng trong trường hợp của tôi, tôi đã biết rằng có một kết hợp giữa keypoint i từ hình ảnh 1 và keypoint j từ hình ảnh 2. Làm thế nào để mô tả đó là một giá trị MatchesInfo. Đặc biệt là các yếu tố phù hợp với loại std :: vector < cv :: DMatch>.

EDIT: Vì vậy, đối với điều này, tôi không cần phải sử dụng bất kỳ matcher hoặc bất cứ điều gì như thế này. Tôi biết cặp nào sẽ đi cùng nhau!

+0

Để 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

Trả lời

5

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.

+0

Mô tả của tôi thuộc loại cv :: Mat, làm cách nào để chuyển đổi chúng thành vector >? hoặc nó có thể được chuyển đổi tự nhiên? – widgg

Các vấn đề liên quan