• Không có kết quả nào được tìm thấy

Phương pháp lấy mẫu con Poisson – Disk

Phương pháp lấy mẫu con Poisson-Disk trong Potree được sử dụng để tạo ra các mẫu con cách đều nhau với khoảng cách tối thiểu giữa các điểm, mỗi nút lưu trữ một tập hợp con các điểm có độ phân giải nhất định. Hình 2.6 mô tả một số phương pháp lấy mẫu khác nhau, cấu trúc MNO sử dụng lưới ba chiều để lữu trữ các điểm mà nó rơi vào các ô trong lưới, phương pháp này đơn giản và nhanh chóng nhưng có nhược điểm là không tính đến khoảng cách tối thiểu giữa các điểm khiến các điểm trong ô liền kề được chọn ngay cả khi chúng nằm gần nhau. Các phương pháp lấy mẫu chất lượng cao hơn thì có khoảng cách giữa các điểm. Ví dụ: phương pháp lấy mẫu dựa trên lưới đã cải tiến của Entwine [11] sử dụng các điểm gần với tâm của các ô và có thể hoán đổi một điểm đã được xác định với một điểm mới nếu điểm mới gần tâm của ô hơn.

Hình 2. 6. Mô tả các phương pháp lấy mẫu trên cùng tập dữ liệu thô đầu vào.

Trong Potree sử dụng phương pháp lấy mẫu Poisson-Disk, mỗi điểm sẽ có khoảng cách tối thiểu đến những điểm khác, dữ liệu được hiển thị trực quan hơn so với phương pháp lấy mẫu theo lưới và cung cấp khả năng bao phủ tốt với số lượng nhỏ các point cloud. Việc thiết lập khoảng cách tối thiểu giữa các điểm yêu cầu tính toán một cấu trúc phức tạp, Poisson-Disk dựa trên thuật toán ném phi tiêu, bằng cách tạo ngẫu nhiên ra các điểm rồi kiểm tra xem khoảng cách giữa các điểm vừa được tạo với các điểm được chấp nhận trước đó có đủ lớn không, nếu khoảng cách nhỏ sẽ bị loại bỏ.

Một số thuật toán ném phi tiêu cải tiến cách thức tạo ra các điểm, và vị trí của các điểm mẫu để nâng cao hiệu suất, trong việc lấy mẫu con cho point cloud, Potree sử dụng tập mẫu cố định và chỉ xử lý các điểm quá gần nhau. Để giảm số lần tính toán khoảng cách giữa các điểm, họ chia ra mỗi nút thành một lưới và chỉ tính toán khoảng cách đến các điểm bên trong các ô giống nhau và liền kề. Lưới mẫu được thiết kế dưới dạng mảng vì các point cloud thường mô tả bề mặt, do đó chỉ một phần nhỏ các ô lưới chứa các điểm và giảm đi đáng kể bộ nhớ khi tính toán. Thư viện C++ cung cấp một hash maps là: unordered_map được dùng như một mảng ba chiều, mỗi ô lưu trữ các điểm được xác định và được tham chiếu đến các ô liền kề, nhanh chóng tham chiếu đến các điểm trong ô lân cận và không cần truy cập hash maps.

Các điểm mới được xác định nếu có khoảng cách nhỏ nhất đến tất cả các điểm trong ô đó so với các điểm trong các ô liền kề. Trong quá trình tạo ô dữ liệu mới, các vùng xung quanh sẽ được kiểm tra, nếu có sẽ được thêm vào danh sách tham chiếu, và

các ô đã có cũng được bổ sung tham chiếu ô mới. Kích thước của một ô là bất kỳ giá trị nào giữa khoảng cách và kích thước của chính ô đó, kích thước của ô bằng hoặc lớn hơn khoảng cách mới đảm bảo các điểm được kiểm tra và lưu trữ trong cùng một ô hoặc liền kề. Ban đầu giá trị khoảng cách được lựa chọn phù hợp với kích thước của ô để giảm số lần kiểm tra xuống ít nhất nhưng sau đó Yin Fei [20] đã phát hiện ra rằng điều đó dẫn tới sử dụng nhiều bộ nhớ không cần thiết và hiệu suất thấp, họ đề xuất sử dụng kích thước ô lớn để thay thế vì việc tăng kích thước ô sẽ giảm số lượng ô và giảm dung lượng bộ nhớ cần lưu trữ khi xử lý tính toán.

Hình 2. 7. Lưới kiểm tra khoảng cách.

Hình 2.7 Mô tả lưới kiểm tra khoảng cách, việc kiểm tra được thực hiện đối với các điểm bên trong giống nhau và các điểm bên trong các ô lân cận. Hình (a) quá trình kiểm tra ít nhưng lại sử dụng dung lượng bộ nhớ lớn và tính toán nhiều hơn, hình (b) quá trình kiểm tra nhiều nhưng sử dụng ít bộ nhớ và tính toán ít hơn. Và đồng thời cho thấy ảnh hưởng của kích thước lưới khác nhau, khi bất cứ một điểm nào được thêm vào thì khoảng cách đến các điểm bên trong cùng một ô và các điểm tại ô lân cận được tính toán. Các điểm đạt khoảng cách tối thiểu thì sẽ được thêm vào lưới, và các điểm tiếp theo sẽ được kiểm tra khoảng cách với các điểm cũ đã được kiểm tra. Các ô chứa điểm được tạo và lưu trữ trong mảng, mỗi ô trong mảng chứa danh sách các điểm và danh sách các ô lân cận.