2013-06-08 29 views
14

Tôi có một câu hỏi ngắn: Khi tôi thực hiện đối sánh tính năng trong OpenCV, nghĩa là thuộc tính distance của DMatches trong MatOfMatches là gì?Thuộc tính khoảng cách trong DMatches có nghĩa là gì?

Tôi biết rằng tôi phải lọc các kết quả phù hợp với khoảng cách lớn hơn vì chúng không tốt bằng khoảng cách thấp hơn. Nhưng ý nghĩa của thuộc tính này là gì? Nó là một loại sai lệch?

Trả lời

17

Trong bối cảnh này, một tính năng là một điểm quan tâm đến hình ảnh. Để so sánh các tính năng, bạn "mô tả" chúng bằng cách sử dụng trình phát hiện tính năng . Mỗi tính năng sau đó được liên kết với một mô tả . Khi bạn so khớp các đối tượng địa lý, bạn thực sự khớp với các mô tả của chúng.

Bộ mô tả là một vectơ đa chiều. Có thể là có giá trị thực (ví dụ: SIFT) hoặc nhị phân (ví dụ: BRIEF).

Kết hợp là một cặp mô tả, một từ mỗi hình ảnh, giống nhau nhất trong số tất cả các bộ mô tả. Và dĩ nhiên, để tìm bộ mô tả trong hình B giống với mô tả nhất trong hình A, bạn cần một thước đo về sự giống nhau này.

Có nhiều cách để tính toán "điểm giống nhau" giữa hai vectơ. Đối với các mô tả có giá trị thực, các số Euclidean distance thường được sử dụng, khi Hamming distance là phổ biến cho các bộ mô tả nhị phân.

Như một kết luận, bây giờ chúng ta có thể hiểu thuộc tính distance: đó là điểm tương đồng giữa hai bộ mô tả của một trận đấu.

+0

Cảm ơn bạn đã trợ giúp nhanh! Đó là rất khai sáng ;-) – stetro

+0

Một câu hỏi ngắn còn lại, tại sao các thuật toán kết hợp lại cho tôi kết quả phù hợp với khoảng cách lớn khi chúng rõ ràng không giống nhau? – stetro

+1

Chúng cung cấp cho phù hợp với _best_ với các mô tả bạn có. Một số là đúng, một số thì không. Các kỹ thuật khác nhau tồn tại để lọc ra các ngoại lệ, nhưng cách tốt nhất phụ thuộc vào tình huống và đây không phải là công việc của chính nó ... – JonesV

4

Thông thường khi bạn kết hợp hai tính năng, bạn thực sự so sánh hai vectơ theo các chỉ số khoảng cách nhất định. Bây giờ chúng ta hãy giả định tính năng của bạn là SIFT với 128 kích thước, và bạn so sánh hai tính năng SIFT ab sử dụng khoảng cách Euclide, sau đó DMatch.distance bằng

formula

+0

Cảm ơn bạn đã có mẹo với API Google ;-) – stetro

0

Thuộc tính khoảng cách trong DMatch là thước đo sự giống nhau giữa hai bộ mô tả (vectơ đặc trưng). Nếu khoảng cách ít hơn, thì hình ảnh sẽ giống nhau và ngược lại.

Một bài học rút ra từ kinh nghiệm của tôi khi tôi bắt đầu ra:

Đừng nhầm lẫn giữa DMatch.distance với khoảng cách không gian bình thường giữa hai điểm. Cả hai đều khác nhau. Khoảng cách trong DMatch đại diện cho khoảng cách giữa hai mô tả (vectơ với 128 giá trị trong trường hợp SIFT)

Trong trường hợp SIFT (mô tả tính năng địa phương):

1) Trước tiên, bạn phát hiện điểm chính (điểm thú vị) cho hai hình ảnh mà bạn muốn so sánh.

2) Sau đó, bạn tính toán các ký hiệu sift cho một khu vực xác định (khu vực 16 X 16 xung quanh mỗi điểm chính) xung quanh tất cả các điểm chính. Mỗi bộ mô tả lưu trữ biểu đồ của các gradient được định hướng cho khu vực xung quanh mỗi điểm chính.

3) Cuối cùng, các bộ mô tả của cả hai hình ảnh được đối sánh để tìm các điểm chính phù hợp giữa các hình ảnh. Điều này được thực hiện bằng cách sử dụng BFMatcher -> match(), knnMatch() hoặc FlannBasedMatcher -> knnMatch().

4) Nếu bạn đang sử dụng BFMatcher.match(), bạn sẽ nhận được danh sách các đối tượng DMatch. Số lượng đối tượng DMatch bằng với số lượng kết quả phù hợp. Mỗi đối tượng DMatch chứa bốn thuộc tính sau cho mỗi cặp điểm khóa phù hợp.

DMatch.distance - Distance between descriptors. The lower, the better it is. 
DMatch.trainIdx - Index of the descriptor in train descriptors(1st image) 
DMatch.queryIdx - Index of the descriptor in query descriptors(2nd image) 
DMatch.imgIdx - Index of the train image. 

5) DMatch.Distance thể là một trong nhiều biện pháp cách ly -> Norm_L1, Norm_L2 (Euclide khoảng cách), khoảng cách Hamming, Hamming2 khoảng cách, ... có thể được đề cập như một tham số trong BFMatcher. Khoảng cách mặc định là Euclide.

6) Sự khác nhau giữa không gian Euclide khoảng cách và DMatch Euclide khoảng cách:

SIFT mô tả 1 -> [a1, a2, .... a128]

SIFT mô tả 2 -> [b1, b2, .... b128]

(DMatch) -> Khoảng cách Euclide = sqrt [(a1-b1)^2 + (a2-b2)^2 + ... + (a128-b128)^2 ]

Điểm 1 -> (x1, y1)

điểm 2 -> (x2, y2)

(không gian) -> Euclide khoảng cách = sqrt [(x2-x1)^2 + (y2-y1)^2]

Vì vậy , khoảng cách này từ DMatch là khoảng cách giữa các descriptor và nó đại diện cho mức độ tương tự giữa hai descriptor và khác với khoảng cách euclide không gian bình thường giữa hai điểm.

Nếu khoảng cách giữa các bộ mô tả nhỏ hơn, thì độ tương đồng của chúng cao. Nếu khoảng cách giữa các mô tả là nhiều hơn, thì sự tương đồng của chúng thấp.

Hy vọng điều này sẽ giúp hiểu được ý nghĩa của thuộc tính khoảng cách trong đối tượng DMatch. Nếu bạn rõ ràng về điều này, thì bạn có thể làm việc với bất kỳ bộ mô tả tính năng nào như HOG, SIFT, SURF, ORB, BRISK, FREAK, ... Tất cả chúng đều tương tự nhau khi kết hợp với các mô tả tính năng tương ứng của chúng.

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