Phần 1: Tổng quan về Poind Cloud library (PCL)
PCL là thư viện hỗ trợ xử lý ảnh
3D, được xây dựng với nhiều module thực hiện các thuật toán như: Lọc
(filtering), Khôi phục bề mặt (Surface reconstruction), phân vùng
(segmentation), Ước lượng đặc tính vật (Feature estimation ).
Thư viện đi
kèm để hỗ trợ được chia nhỏ và có thể biên dịch độc lập. Các thư viện này gồm
có :
·
Eigen: Hỗ trợ các phép toán tuyến tính, dùng vào
hầu hết các tính toán toán học của PCL.
·
FLANN: (Fast Library for Approximate Nearest
Neighbors) Tìm kiếm nhanh các điểm lân cận trong không gian 3D.
·
Boost: Giúp chia sẻ con trỏ trên tất cả các
module và thuật toán trong PCL để tránh sao chép và trùng dữ liệu đã lấy về
trong hệ thống.
·
VTK: (Visualization Toolkit) Hỗ trợ nhiều
platform trong việc thu về dữ liệu 3D, hỗ trợ hiển thị, ước lượng thể tích vật
thể.
·
CminPack : Thư viện mở giúp giải quyết phép toán
tuyến tính và không tuyến tính.
Thư viện có tất cả 14 module bao
gồm:
1.1 PCL_Common:
-
Chứa cấu trúc
dữ liệu và phương thức được sử dụng bởi
phần lớn các thư viện trong PCL
-
Cấu trúc dữ liệu cốt lõi là các class pointClound, các
loại dữ liệu biểu diễn điểm, bề mặt, giá trị mầu, mô tả tính năng…
VD: PCL::PointXYZ; PCL::PointXY;
PCL::PointXYZRGB;
1.2 Module Features:
-
Chứa các cấu trúc dữ liệu và cơ chế tính toán, ước
lượng 3D từ các dữ liệu điểm PCD
-
3D Features biểu diễn chính xác điểm 3D hoặc vị trí
trong không gian để mô tả phần hình khối dựa vào thông tin có được xung quanh
điểm. Vùng dữ liệu được chọn lân cận
điểm truy vấn thường gọi là K-neighborhood.
PCL_filters Chứa
các kỹ thuật loại bỏ nhiễu.
Chứa tất cả các cấu trúc dữ liệu và giải thuật
để tính toán hình học.
PCL_IO: Chứa các
hàm và các lớp để đọc và ghi dữ liệu dạng PCD, có thể thu thập dữ liệu từ nhiều
nguồn khác nhau (Trong đồ án này dùng
Kinect).
Thư viện cung
cấp cấu trúc dữ liệu Kd_tree, sử dụng FLANN giúp nhanh chóng tìm kiếm vùng gần
nhất (nearest neighbors searches).
Kd-tree là một cấu trúc dữ liệu phân để vùng không gian lưu
trữ tập K-dimention điểm dưới dạng cây do đó dễ dàng phân loại và tìm kiếm.
Có thể sử dụng để tìm sự tương ứng giữa các nhóm điểm, đặc tả tính năng,
định nghĩa các vùng lân cận xung quanh điểm hoặc các điểm.
Là thư viện chứa thực thi của 2 thuật toán
nhận dạng “Point clound keypoint”.
Key Point (hay interest point) là các điểm
trong ảnh hoặc trong point cloud mà có tính chất ổn định, riêng biệt và có
thể dễ dàng phát hiện ra. Thông thường
số lượng Key Point nhỏ hơn tổng số điểm trong cloud.
Chứa các thuật toán hiệu quả để tạo nên một cấu trúc dữ liệu phân cấp từ
dữ liệu point cloud. Nó cho phép phân vùng không gian, downsampling (giảm số
lượng các mẫu do đó tăng tốc độ tính toán) và thực hiện các phép toán tìm kiếm
trong tập dữ liệu PointCloud. Mỗi nút Octree có 8 nút con hoặc không có nút con
nào. Nút gốc (mầu đỏ hình dưới )được biểu diễn trong 1 hình lập phương bao toàn
bộ các điểm con. Tại mỗi cấp của cây, không quan được chia thành 2 do đó tăng
độ phân giải cho điểm ảnh không gian 3 chiều.
Thư viện này cũng cung cấp các chương trình tìm kiếm lân cận
hiệu quả.
1.9 Module registrantion (PCL_registration):
Kết hợp các bộ dữ liệu vào một mô hình chung, thống nhất
thường được thực hiện bằng một kỹ thuật gọi là registration.
Ý tưởng chính là xác định các điểm tương ứng trong bộ
dữ liệu và tìm một chuyển đổi khoảng cách tối thiểu các điểm tương ứng.
1.10 Module PCL_sample_consensus:
Thư viện
pcl_sample_consensus có khả năng tách các nhóm điểm có cùng tính chất (Sample
Consensus hay SAC) giống như thuật toán RANSAC (Tìm kiếm đường thẳng trong tập
hợp các điểm). Các nhóm điểm có thể là các mặt phẳng, mặt cầu, trụ. Thư viện
này rất thích hợp trong các ứng dụng dò tìm các đối tượng như tường, cửa, các
vật trên bàn…
Cung cấp các
phương pháp tìm kiếm lân cận (nearest neighbors) bằng cách sử dụng các cấu trúc
dữ liệu khác nhau, bao gồm:
-
Kd_tree (từ thư viện PCL_Kdtree)
-
Octrees (từ thư viện PCL_Octrees)
-
Brute foce (Thuật toán)
-
Các tìm kiếm đặc biệt cho các bộ dữ liệu có tổ chức.
Chứa các thuật toán để phân chia
Point Cloud thành các nhóm riêng biệt. Các thuật toán này thích hợp nhất khi xử
lý các point Cloud bao gồm các vùng không gian bị cô lập. Trong trường hợp như
vậy, các clustering thường chia nhỏ để sau đó có thể xử lý độc lập.
Là thư viện thích
hợp cho việc xây dựng lại các bề mặt từ dữ liệu quét 3D. Các đối tượng chính
gồm vỏ, bề mặt lưới, bề mặt nhẵn hay bình thường. Khi có nhiễu có thể làm mịn
và lấy mẫu lại.
Chia lưới (
meshing ) là một cách tổng quát để tạo ra các bề mặt điểm. Hiện nay có 2 thuật
toán là a very fast triagulation of the
original points và aslower meshing that does smoothing and hold filling as well.
Có thể dùng thư
viện để tạo ra một thân lồi hoặc lõm thích hợp cho đại diện bề mặt đơn giản hóa
hoặ chỉ ra các ranh giới.
Thư viện được tạo ra có thể nhanh
chóng hiển thị các kết quả thuật toán trên dữ liệu 3D. Thư viện cung cấp:
- Các phương pháp dựng hình và
thiết lập thuộc tính ảnh, mầu sắc, kích thước cho bất kì bộ dữ liệu nào có kiểu
“PCL::PointCloud<T>”
- Vẽ các hình 3D
cơ bản từ bộ điểm hoặc phương
trình tham số.
- Vẽ các biểu đồ.
2. Cấu trúc dữ liệu cơ bản của PCL
2.1 PointCloud:
Kiểu dữ liệu cơ bản trong PCL là PointCloud. Một PointCloud
là 1 lớp C++ bao gồm:
·
Width (int): Xác định chiều dài tập dữ liệu bằng
số lượng điểm. “Width” có 2 nghĩa là
o
Có thể xác định tổng số các điểm trong cloud
(bằng số lượng các phần tử trong cloud) cho bộ dữ liệu có tổ chức.
o
Có thể xác định chiều rộng (tổng số điểm liên
tiếp) của một tập dữ liệu có tổ chức
Chú ý: Tập dữ
liệu điểm có tổ chức là tập dữ liệu được chia thành các hàng và cột giống như
ma trận.
Vd: cloud.width=640;// Tao ra 640 diem tren mot dong
·
Height (int): Tương tự width nhưng đối với cột
trong ma trận điểm.
Nếu hieght=1 thì dữ liệu không được tổ chức
(có thể dùng tính chất này để kiểm tra một tập dữ liệu có được tổ chức hay
không)
Vd:
cloud.width = 640; // Khai bao mot anh co cau truc, gom 640 dong va 480 cot
cloud.height = 480; // tong so diem anh la 640*480=307200.
·
Points (std::vector<PointT>)
Chứa các mảng dữ liệu lưu trữ tất cả các
điểm có kiểu pointT.
Kiểu PointT có thể là pcl::PointXYZ,
pcl::PointXYZRGB, pcl::PointXYZRGBA…
Ví dụ:
pcl::PointCloud<pcl::PointXYZ> cloud;
std::vector<pcl::PointXYZ> data = cloud.points;
·
Is_dense(bool)
Trả về giá trị logic, nếu tất cả giá trị
trong points hữu hạn => True ngược lại là False.
Ngoài
ra lớp pointCloud còn chứa các thành phần chứa các tùy chọn của sensor
như Sensor_origin, sensor_orientation. Các thành phần này thường ít dùng trong
các thuật toán của PCL.
2.2 Định dạng PCD:
Định dạng PCD là một định dạng dùng
để lưu trữ dữ liệu 3d pointCloud. Định dạng này gồm 2 phần là header và phần dữ
liệu.
-
Mỗi file có một phần header xác định các tính chất,
thuộc tính của dữ liệu mà nó lưu trữ. Header của PCD được mã hóa bằng mã ASCII.
-
Trong header gồm có
o
VERSION: xác định phiên bản định dạng PCD
o
FIELDS: Xác định tên các chiều và các trường của
mỗi điểm:
Vd:
FIELDS x y z # XYZ data
FIELDS x y z rgb # XYZ + colors
FIELDS x y z normal_x normal_y normal_z # XYZ + surface normals
FIELDS j1 j2 j3 # moment invariants
...
o
SIZE: Xác định kích thước các chiều tính theo
byte
Vd:
Unsigned char/char ứng với 1byte
Unsigned short/short ứng với 2byte
Unsigned int/int ứng với 4 byte
Double ứng với 8byte.
o
TYPE: Quy định kiểu của mỗi chiều, quy ước bằng
các ký tự.
I
- Biểu diễn kiểu số nguyên có dấu (int8, int16,int32)
U – Biểu diễn kiểu số nguyên
không dấu.
F- Biểu diễn kiểu số thực.
o
WIDTH : Xác định chiều rộng tập dữ liệu tính
theo điểm.
o
HEIGHT: Tương tự WIDTH nhưng tính cho chiều dài. Nếu giá trị bằng 1
thì dữ liệu chưa được tổ chức.
o
POINT:
chứa giá trị tổng số điểm ảnh.
Phần 2 là DATA chứa dữ liệu của
từng điểm, mỗi điểm có thể được mã hóa theo bin hay ASCII.
Ví dụ
một file PCD sẽ có dạng như sau:
# .PCD v.7 - Point Cloud Data file format
VERSION .7
FIELDS x y z rgb # Chứa tọa độ và mầu dạng RGB
SIZE 4 4 4 4 # Mỗi thành phần tọa đọ xyz và mầu lưu bằng 4byte
TYPE F F F F # Kiểu dữ liệu mỗi thành phần là số thực
COUNT 1 1 1 1
WIDTH 4 # Độ rộng của dữ liệu là 4
HEIGHT 1 # Dữ liệu không được tổ chức.
VIEWPOINT 0 0 0 1 0 0 0
POINTS 4 # Tổng số điểm ảnh là 4
DATA ascii # Dữ liệu được mã hóa bằng mã ascii
0.93773 0.33763 0 4.2108e+06 # Các giá trị của tọa độ và mầu của các điểm.
0.90805 0.35641 0 4.2108e+06
0.81915 0.32 0 4.2108e+06
0.97192 0.278 0 4.2108e+06
Để ghi và
đọc dữ liệu dạng PCD, PCL có cung cấp thư viện IO để xử lý. Chi tiết thư viện
này có thể tham khảo thêm trong phần help.
Kiên ơi, chị có việc muốn liên hệ với em.
Trả lờiXóaChị Mai - chuyên viên tuyển dụng - 01299 23 1988