2011-09-04 54 views
17

Tôi có câu hỏi về các đối tượng khớp với OpenCV. Tôi đang sử dụng thuật toán SURF được triển khai trong opencv 2.3 để phát hiện các tính năng trên mỗi hình ảnh, sau đó trích xuất các mô tả về các tính năng này. Vấn đề trong kết hợp sử dụng Brute Force Matcher, tôi không biết làm thế nào tôi đánh giá rằng hai hình ảnh được khớp hoặc không giống như khi tôi đang sử dụng hai hình ảnh khác nhau có những dòng giữa các descriptors trong hai hình ảnh!OpenCV - Đối sánh đối tượng bằng cách sử dụng các mô tả SURF và BruteForceMatcher

Kết quả đầu ra của mã của tôi, hai hình ảnh -I so sánh với chúng - giống nhau hoặc khác nhau, hình ảnh kết quả cho biết rằng hai hình ảnh được khớp.

Câu hỏi đặt ra là: Làm cách nào để phân biệt giữa hai hình ảnh?

Đúng khớp:

http://store1.up-00.com/Jun11/hxM00286.jpg

False phù hợp !! :

http://store1.up-00.com/Jun11/D5H00286.jpg

Mã của tôi:

Mat image1, outImg1, image2, outImg2; 

// vector of keypoints 
vector<KeyPoint> keypoints1, keypoints2; 

// Read input images 
image1 = imread("C://Google-Logo.jpg",0); 
image2 = imread("C://Alex_Eng.jpg",0); 

SurfFeatureDetector surf(2500); 
surf.detect(image1, keypoints1); 
surf.detect(image2, keypoints2); 
drawKeypoints(image1, keypoints1, outImg1, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS); 
drawKeypoints(image2, keypoints2, outImg2, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS); 

namedWindow("SURF detector img1"); 
imshow("SURF detector img1", outImg1); 

namedWindow("SURF detector img2"); 
imshow("SURF detector img2", outImg2); 

SurfDescriptorExtractor surfDesc; 
Mat descriptors1, descriptors2; 
surfDesc.compute(image1, keypoints1, descriptors1); 
surfDesc.compute(image2, keypoints2, descriptors2); 

BruteForceMatcher<L2<float>> matcher; 
vector<DMatch> matches; 
matcher.match(descriptors1,descriptors2, matches); 

nth_element(matches.begin(), matches.begin()+24, matches.end()); 
matches.erase(matches.begin()+25, matches.end()); 

Mat imageMatches; 
drawMatches(image1, keypoints1, image2, keypoints2, matches, imageMatches, Scalar(255,255,255)); 

namedWindow("Matched"); 
imshow("Matched", imageMatches); 

cv::waitKey(); 
return 0; 

Trả lời

17

Vấn đề được trong việc sử dụng Brute Force Matcher chỉ, tôi thấy phương pháp để có được một tập hợp các trận đấu tốt giữa hai quan điểm tại "OpenCV 2 Computer Vision Ứng dụng Lập trình Cookbook "

Ch9: Ghép hình ảnh bằng cách sử dụng mẫu ngẫu nhiên đồng thuận

.210

Họ đang sử dụng K-gần hàng xóm và RANSAC

Và nhờ

+2

Cuốn sách này hóa ra khá hữu ích! –

+1

Bạn nên chấp nhận câu trả lời của mình. –

8

Đối với loại bỏ giá trị ngoại biên RANSAC + homography là một phương pháp tốt khi so sánh hai hình ảnh phẳng.

Homography là mô hình mà RANSAC sẽ cố gắng sử dụng để so sánh các điểm từ cả hai hình ảnh và nó sẽ tìm ra các điểm tốt nhất phù hợp hơn với mô hình chiếu của homography (chuyển đổi từ mặt phẳng này sang mặt phẳng khác).

cv::findHomography(srcPoints,dstPoints, RANSAC, status); 

Chức năng trên sẽ trả về một tình trạng mảng mà có một 1 cho chỉ số coi inliers và 0 cho các chỉ số được coi là giá trị ngoại biên, vì vậy bạn có thể xóa giá trị ngoại biên bằng cách kiểm tra mảng tình trạng này.

+1

Sử dụng 'LMEDS' (' Calib3d.LMEDS' trên Android) cho kết quả tốt hơn với tôi, tôi không biết tại sao, trong dự án khóa học của tôi, RANSAC ở Matlab đã cho kết quả rất tốt đẹp. Nhưng dứt khoát, loại bỏ outliners là phải! – Mustafa

3

Bạn cần sửa đổi Hessian, 2500 của bạn quá nhiều. Hãy thử 50. Khi bạn sử dụng một Hessian lớn, kết quả là rất nhiều điểm chính, kết quả là không cần thiết. Một thông tin khác về SURF là điểm đánh dấu của bạn cần phải phong phú hơn, với nhiều chi tiết hơn.

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