Chúng ta biết rằng keypoint của bạn được lưu trữ trong kp1
và kp2
nơi họ là những tính năng phù hợp cho hình ảnh đầu tiên và thứ hai tương ứng. Trong phối cảnh cv2.ORB
, đây là các ma trận 2D trong đó mỗi hàng là một điểm quan trọng được phát hiện trong hình ảnh đầu tiên, kp1
và hình ảnh thứ hai, kp2
.
Trong trường hợp của bạn bởi vì bạn đang sử dụng cv2.BFMatch
, matches
trả về một danh sách các đối tượng cv2.DMatch
nơi từng đối tượng chứa một số thành viên .... trong đó có hai thành viên quan trọng:
queryIdx
- Chỉ số hoặc hàng của ma trận kp1
lãi suất thời điểm đó phù hợp với
trainIdx
- chỉ số hoặc hàng của ma trận điểm kp2
lãi suất phù hợp với
Do đó, queryIdx
và trainIdx
cho bạn biết tính năng ORB nào khớp giữa kp1
và kp2
. Do đó, bạn sẽ sử dụng các chỉ mục này để lập chỉ mục thành kp1
và kp2
và nhận được thành viên pt
, là một bộ tọa độ của các tọa độ (x,y)
xác định tọa độ không gian thực tế của các kết quả phù hợp.
Tất cả những gì bạn phải làm là lặp qua từng đối tượng cv2.DMatch
trong matches
, thêm vào danh sách tọa độ cho cả kp1
và kp2
và bạn đã hoàn tất.
Something như thế này:
# Initialize lists
list_kp1 = []
list_kp2 = []
# For each match...
for mat in matches:
# Get the matching keypoints for each of the images
img1_idx = mat.queryIdx
img2_idx = mat.trainIdx
# x - columns
# y - rows
# Get the coordinates
(x1,y1) = kp1[img1_idx].pt
(x2,y2) = kp2[img2_idx].pt
# Append to each list
list_kp1.append((x1, y1))
list_kp2.append((x2, y2))
Lưu ý rằng tôi có thể vừa thực hiện list_kp1.append(kp1[img1_idx].pt)
và tương tự cho list_kp2
, nhưng tôi muốn làm cho nó rất rõ ràng về cách giải thích các tọa độ không gian. Bạn cũng có thể đi một bước xa hơn và làm một danh sách hiểu:
list_kp1 = [kp1[mat.queryIdx].pt for mat in matches]
list_kp2 = [kp2[mat.trainIdx].pt for mat in matches]
list_kp1
sẽ chứa các toạ độ không gian của một điểm tính năng phù hợp với vị trí tương ứng trong list_kp2
. Nói cách khác, phần tử i
của list_kp1
chứa tọa độ không gian của điểm đối tượng từ img1
khớp với điểm đối tượng tương ứng từ img2
trong list_kp2
tọa độ không gian có phần tử i
.
Là một sidenote nhỏ, tôi đã sử dụng khái niệm này khi tôi đã viết một workaround cho drawMatches
bởi vì đối với OpenCV 2.4.x, Python wrapper cho C++ chức năng không tồn tại, vì vậy tôi đã sử dụng khái niệm nêu trên trong định vị tọa độ không gian của các đối tượng địa lý phù hợp giữa hai hình ảnh để viết thực hiện của riêng tôi về nó.
Kiểm tra xem bạn có thích không!
module' object has no attribute 'drawMatches' opencv python
Hơn bạn rất nhiều! – kotopanda