Điều này luôn luôn đòi hỏi rất nhiều tính toán, đặc biệt nếu bạn muốn xử lý tới 2000 điểm. Tôi chắc chắn đã có các giải pháp được tối ưu hóa cao cho loại kết hợp mẫu này, nhưng bạn phải tìm ra cái mà nó được gọi để tìm ra chúng.
Vì bạn đang nói về một đám mây điểm (dữ liệu thưa thớt) thay vì hình ảnh, phương pháp tương quan chéo của tôi không thực sự được áp dụng (và thậm chí còn tệ hơn về mặt tính toán). Một cái gì đó như RANSAC có thể tìm thấy một trận đấu nhanh chóng, nhưng tôi không biết nhiều về nó.
Nỗ lực của tôi tại một giải pháp:
Giả định:
- Bạn muốn tìm trận đấu hay nhất, không chỉ là trận đấu lỏng lẻo hay "có lẽ đúng"
- Trận đấu sẽ có một số lỗi nhỏ do nhiễu trong phép đo hoặc tính toán
- Điểm nguồn là coplanar
- Tất cả các điểm nguồn phải tồn tại trong mục tiêu (= bất kỳ điểm nào chưa từng có là không khớp cho toàn bộ hồ sơ)
Vì vậy, bạn sẽ có thể có nhiều phím tắt bằng cách loại bỏ mọi thứ và giảm thời gian tính toán. Nói ngắn gọn:
- chọn ba điểm từ nguồn
- tìm kiếm thông qua các điểm mục tiêu, tìm bộ 3 điểm có cùng hình dạng
- khi tìm thấy kết quả trùng khớp 3 điểm, hãy kiểm tra tất cả các điểm khác trong mặt phẳng mà họ xác định để xem liệu chúng có khớp nhau không
- nếu tìm thấy nhiều hơn một trận đấu của tất cả các điểm, hãy chọn một điểm có tổng sai số khoảng cách 3D nhỏ nhất
Chi tiết hơn:
pick a point from the source for testing s1 = (x1, y1)
Find nearest point in source s2 = (x2, y2)
d12 = (x1-x2)^2 + (y1-y2)^2
Find second nearest point in source s3 = (x3, y3)
d13 = (x1-x3)^2 + (y1-y3)^2
d23 = (x2-x3)^2 + (y2-y3)^2
for all (x,y,z) test points t1 in target:
# imagine s1 and t1 are coincident
for all other points t2 in target:
if distance from test point > d12:
break out of loop and try another t2 point
if distance ≈ d12:
# imagine source is now rotated so that s1 and s2 are collinear with t1 and t2
for all other points t3 in target:
if distance from t1 > d13 or from t2 > d23:
break and try another t3
if distance from t1 ≈ d13 and from t2 ≈ d23:
# Now you've found matching triangles in source and target
# align source so that s1, s2, s3 are coplanar with t1, t2, t3
project all source points onto this target plane
for all other points in source:
find nearest point in target
measure distance from source point to target point
if it's not within a threshold:
break and try a new t3
else:
sum errors of all matched points for this configuration (defined by t1, t2, t3)
Cấu hình nào có lỗi bình phương nhỏ nhất cho tất cả các điểm khác là phù hợp nhất
Vì chúng tôi đang làm việc với 3 điểm kiểm tra lân cận gần nhất, nên có thể đơn giản hóa các điểm mục tiêu phù hợp bằng cách kiểm tra xem chúng có nằm trong bán kính không. Chẳng hạn, nếu tìm kiếm bán kính 1 từ (0, 0), chúng ta có thể loại bỏ (2, 0) dựa trên x1 - x2, mà không tính khoảng cách Euclide thực tế, để tăng tốc độ lên một chút. Điều này giả định rằng phép trừ nhanh hơn phép nhân. Cũng có những tìm kiếm được tối ưu hóa dựa trên bán kính cố định tùy ý hơn .
function is_closer_than(x1, y1, z1, x2, y2, z2, distance):
if abs(x1 - x2) or abs(y1 - y2) or abs(z1 - z2) > distance:
return False
return (x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2 > distance^2 # sqrt is slow
d= ( X1- x2)2+ ( y1- y2)2+ ( z1- z2)2----------------------------√
( 20002)
Trên thực tế, vì dù sao bạn cũng sẽ cần tính toán tất cả những điều này, cho dù bạn có tìm thấy kết quả khớp hay không và vì bạn chỉ quan tâm đến hàng xóm gần nhất cho bước này, nếu bạn có bộ nhớ, có thể tốt hơn để tính toán trước các giá trị này bằng thuật toán tối ưu hóa . Một cái gì đó giống như một tam giác Delaunay hoặc Pitteway , trong đó mọi điểm trong mục tiêu được kết nối với các nước láng giềng gần nhất. Lưu trữ chúng trong một bảng, sau đó tìm kiếm chúng cho từng điểm khi cố gắng khớp tam giác nguồn với một trong các tam giác đích.
Có rất nhiều tính toán liên quan, nhưng nó sẽ tương đối nhanh vì nó chỉ hoạt động trên dữ liệu, rất thưa thớt, thay vì nhân nhiều số không vô nghĩa với nhau như tương quan chéo của dữ liệu thể tích sẽ liên quan. Ý tưởng tương tự này sẽ hoạt động cho trường hợp 2D nếu bạn tìm thấy tâm của các chấm trước và lưu trữ chúng dưới dạng một tập hợp tọa độ.