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ảm ơn bạn đã trợ giúp nhanh! Đó là rất khai sáng ;-) – stetro
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
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