Kết hợp hồ sơ trong một đám mây điểm


14

Một đám mây điểm được tạo bằng cách sử dụng chức năng ngẫu nhiên thống nhất cho (x,y,z). Như thể hiện trong hình dưới đây, một mặt phẳng giao nhau ( hồ sơ ) đang được điều tra phù hợp nhất (ngay cả khi không phải là chính xác) một hồ sơ mục tiêu tức là, được đưa ra ở góc dưới bên trái. Vì vậy, câu hỏi là:

1- Làm thế nào để tìm thấy sự trùng khớp như vậy target 2D point mapthông qua point cloudviệc xem xét các ghi chú / điều kiện sau đây?
2- Các tọa độ / định hướng / mức độ tương tự vv là gì?

Lưu ý 1: Cấu hình quan tâm có thể ở bất kỳ vị trí nào với bất kỳ trục quay nào dọc theo trục và cũng có thể có hình dạng khác nhau, ví dụ: hình tam giác, hình chữ nhật, hình tứ giác, vv tùy thuộc vào vị trí và hướng của nó. Trong các trình diễn sau đây chỉ có một hình chữ nhật đơn giản được hiển thị.

Lưu ý 2: Giá trị dung sai có thể được coi là khoảng cách của các điểm từ hồ sơ. Để chứng minh điều này cho hình sau đây giả sử một khoan dung của 0.01lần kích thước nhỏ (~1)như vậy tol=0.01. Vì vậy, nếu chúng ta loại bỏ phần còn lại và chiếu tất cả các điểm còn lại trên mặt phẳng của hồ sơ đang được điều tra thì chúng ta sẽ có thể kiểm tra sự tương đồng của nó với hồ sơ mục tiêu.

Lưu ý 3: Một chủ đề liên quan có thể được tìm thấy tại Điểm nhận dạng mẫu .

nhập mô tả hình ảnh ở đây


@ Nhà phát triển Tắt chủ đề nhưng bạn đang sử dụng phần mềm nào để tạo các lô đó?
Spacey

1
@Mohammad Tôi sử dụng Python+ MatPlotLibđể thực hiện nghiên cứu của mình và tạo các biểu đồ, v.v.
Nhà phát triển

@ Nhà phát triển tuyệt vời - đó là thông qua Python, nhưng ý nghĩa của chúng là 'Python shell ala Matlab'?
Spacey

Các đám mây điểm được lưu trữ như thế nào? Là một tập hợp tọa độ cho tâm của mỗi điểm hoặc dưới dạng tập dữ liệu thể tích có giá trị khác không trong tọa độ xung quanh các điểm?
endolith

@endolith Tất cả các điểm có tọa độ liên quan như P:{x,y,z}. Họ thực sự là điểm không thứ nguyên. Tuy nhiên, với một số xấp xỉ, chúng có thể được phân tách thành kích thước một pixel dưới dạng mảng 3D. Họ cũng có thể kết hợp các thuộc tính khác (như trọng lượng, v.v.) trên tọa độ.
Nhà phát triển

Câu trả lời:


4

Đ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:

  1. chọn ba điểm từ nguồn
  2. 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
  3. 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
  4. 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 độ.


1
Phần đầu tiên trong câu trả lời của bạn thực sự là một phương pháp vũ phu tìm kiếm các điểm gần đó (tính theo ngưỡng) xung quanh tất cả các mặt phẳng có thể thông qua đám mây điểm. Đó là tính toán cực kỳ chuyên sâu, ví dụ, chỉ cần 2000 điểm, sẽ cần phải tính toán khoảng cách 2.662.668.000.000 (Công thức) !
Nhà phát triển

@ Nhà phát triển: Vâng, sẽ cần rất nhiều tính toán, đặc biệt nếu bạn có hàng ngàn điểm. Có, với 2000 điểm, nếu bạn không tìm thấy bất kỳ mặt phẳng nào, cuối cùng bạn sẽ thực hiện 2.658.673.998.000 phép tính. Có lẽ bạn sẽ tìm thấy các mặt phẳng, tuy nhiên, điều này sẽ làm giảm thời gian vì nó dừng lại ngay khi nó tìm thấy đủ điểm. Nhưng dù sao, tôi đã suy nghĩ về điều này và có lẽ có một ý tưởng tốt hơn, và tôi sẽ thay đổi câu trả lời.
endolith

1
Bạn hoàn toàn có điểm hoàn toàn đúng. Chỉ cần thêm rằng các tiêu chí dừng không thể áp dụng ngay cả sau khi tìm thấy một mặt phẳng phù hợp trong khi có thể có một kết hợp tốt hơn nhiều, vì vậy tất cả các mặt phẳng có thể cần phải được kiểm tra. Tôi đã thực hiện ý tưởng này và nhận thấy ngay cả với sự trợ giúp của Fortrancác con số cao hơn 500điểm sẽ không thể có kinh nghiệm với PC.
Nhà phát triển

2

Tôi sẽ thêm mô tả @ mirror2image vào giải pháp thay thế bên cạnh RANSAC, bạn có thể xem xét thuật toán ICP (điểm gần nhất lặp lại), một mô tả có thể được tìm thấy ở đây !

Tôi nghĩ rằng thách thức tiếp theo trong việc sử dụng ICP này là xác định hàm chi phí của riêng bạn và tư thế bắt đầu của mặt phẳng đích đối với dữ liệu điểm đám mây 3d. Một số cách tiếp cận thực tế là giới thiệu một số nhiễu ngẫu nhiên trong dữ liệu trong quá trình lặp để tránh hội tụ đến cực tiểu sai. Đây là phần heuristic tôi đoán bạn cần thiết kế.

Cập nhật:

Các bước ở dạng đơn giản là:

  1. Tìm điểm gần nhất cho mỗi điểm đầu vào.
  2. Tính toán biến đổi từ đầu vào sang mục tiêu, sau đó di chuyển các điểm đầu vào bằng cách sử dụng biến đổi.
  3. Tính toán hàm tương tự (ví dụ: khoảng cách cho mỗi điểm đầu vào wrt đến điểm đích cặp tương ứng của nó).
  4. Kiểm tra điều kiện dừng.

Lặp lại bước 1-4.

Có thư viện có sẵn mà bạn có thể xem xét ở đây ! (Tôi chưa thử nó), có một phần trên phần đăng ký (bao gồm các phương pháp khác).


Cảm ơn các liên kết và đề nghị. Những ý tưởng hữu ích như vậy giúp chúng ta luôn là những nhà nghiên cứu mới làm quen để học hỏi nhanh hơn. Tôi luôn đánh giá cao lời giải thích nhiều hơn.
Nhà phát triển
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.