2010-11-12 44 views
9

Tôi tò mò về cách so sánh các mô tả tính năng OpenCV. Ví dụ: tôi có thể sử dụng cvExtractSURF() để nhận danh sách các tính năng và các bộ mô tả 64 bit (hoặc 128 bit) của chúng tôi, tôi có thể tìm hiểu xem hai mô tả có thể được so sánh như thế nào?OpenCV - So sánh tính năng SURF

Trong bước qua một số mã mẫu, với tôi có vẻ như hai tính năng "phù hợp" của tôi có các bộ mô tả rất khác nhau (ít nhất bằng các giá trị số).

Có ai từng tìm ra cách lấy hai mảng mô tả và so sánh chúng không?

Googling đã không giúp quá nhiều ...

Chúc mừng, Brett

Trả lời

3

Trong OpenCV 2.1 mẫu tập tin find_obj.cpp, hai phương pháp được trình bày:

  • được xây dựng trong chức năng C++ Flann (Flann đưa ra giải pháp aproximate và hoạt động nhanh hơn), tôi không biết chính xác nó như thế nào hoạt động nhưng được ghi lại là here.
  • chức năng C đơn giản hơn (findPairs()) tìm thấy hàng xóm gần nhất bằng cách tính toán khoảng cách euclidian đơn giản giữa các bộ mô tả (xem hàm compareSURFDescriptors()). Laplacian cũng có thể được sử dụng như một chỉ báo đầu tiên về sự giống nhau, vì các điểm phù hợp không có cùng một hệ số Laplacian (1 hoặc -1). Mẫu này có sẵn here.
7

Bạn có thể muốn nhìn vào giấy Local invariant feature detectors: a survey. Đó là một bài báo tuyệt vời với một mô tả về các thiết bị dò tìm tính năng được sử dụng rộng rãi, bao gồm SURF.

+4

Tôi thực sự thấy giấy đó. Tôi đã hy vọng nhìn thấy mã cùng với nó, vì vậy tôi có thể thấy nó được thực sự thực hiện như thế nào. Tuy nhiên, không ai trong số những tài liệu học thuật đó dường như mở mã nguồn của họ. Thất vọng, bởi vì, tái phát minh công việc của họ không bao giờ tầm thường. – Brett

2

Tính năng của SURF là các vectơ đơn vị 64 chiều. Một cách tự nhiên để so sánh hai vectơ đặc trưng là bằng cách tính toán sản phẩm dấu chấm của chúng. Nếu nó gần 1, chúng có tương quan dương mạnh (= chúng tương tự nhau). Nếu nó gần bằng 0, chúng gần như trực giao (không có tương quan). Nếu nó nhỏ hơn 0, chúng có mối tương quan nghịch. Tùy thuộc vào ứng dụng của bạn, bạn có thể xem xét rằng một trận đấu quá (trong trường hợp đó bạn sẽ có giá trị tuyệt đối của sản phẩm dấu chấm) hoặc xem xét nó tồi tệ hơn trực giao.

Thử tính toán một số sản phẩm chấm và xem kết quả bạn nhận được.

+0

Tôi không chắc đây là cách OpenCV tìm kiếm các tính năng phù hợp. Tôi đã tính các sản phẩm chấm cho một tập hợp các điểm mà OpenCV coi là các kết quả phù hợp và không phù hợp, và các sản phẩm chấm đều ở khắp nơi. – Brett

3

Một phương pháp hiệu quả tôi tìm thấy (và được lấy cảm hứng từ một số mã mẫu OpenCV) là - Sử dụng k tìm kiếm lân cận gần nhất với K = 2 để tìm 2 kết quả phù hợp cho mỗi bộ mô tả trong đối tượng truy vấn. bây giờ, nếu khoảng cách (trận đấu thứ nhất) < 0.6 * khoảng cách (trận đấu thứ 2), hãy xem trận đấu thứ nhất là 'trận đấu hay'.

Lý do tại sao bạn cần điều này và lý do tại sao một tìm kiếm lân cận gần nhất đơn giản sẽ không đủ là bởi vì điều đó mang lại rất nhiều dương tính giả.

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