2.2.1. Dữ liệu đám mây điểm ảnh
Kiểu dữ liệu cơ bản trong PCL là dữ liệu đám mây điểm ảnh. Một dữ liệu đám mây điểm ảnh là một 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 dữ liệu đám mây điểm ảnh (bằng số lượng các phần tử trong tập dữ liệu đám mây điểm ảnh) 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.
Ví dụ:
cloud.width=640;// Tạo ra 640 điểm trên một dòng
Height (int): Tương tự width nhưng đối với cột trong ma trận điểm.
Nếu height = 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).
Ví dụ:
cloud.width = 640; // Khai báo một ảnh có cấu trú, gồm 640 dòng và 480 cột cloud.height = 480; // Tổng số điểm ảnh là 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 điểm hữu hạn=>True
và ngược lại là False.
Ngoài ra lớp PCL còn chứa các thành phần chứa các tùy chọn của cảm biến như cảm biến gốc, cảm biến hướng. 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.2. Định dạng dữ liệu đám mây điểm ảnh
Định dạng dữ liệu đám mây điểm ảnh là một định dạng dùng để lưu trữ dữ liệu ba chiểu của điểm ảnh. Định dạng này gồm 2 phần là đầu và phần dữ liệu.
Phần đầu dữ liệu
Mỗi file có một phần đầu xác định các tính chất, thuộc tính của dữ liệu mà nó lưu trữ. Phần đầu của PCD được mã hóa bằng mã ASCII.
Trong phần đầu 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: Ví dụ:
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 Ví dụ:
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 dữ liệu
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
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
Bảng 2.1: Bảng ví dụ về một file PCD
2.3. Mô đun phân vùng đối tượng và các mô đun tương tác 2.3.1. Mô đun tìm kiếm lân cận 2.3.1. Mô đun tìm kiếm lân cận
1. pcl::search::BruteForce< PointT >
Thực hiện một thuật toán tìm kiếm vét cạn đơn giản. Biểu đồ kế thừa:
Hình 2.15: Biểu đồ kế thừa lớp pcl::search::BruteForce< PointT >
Biểu đồ cộng tác:
2. pcl::search::FlannSearch< PointT, FlannDistance >
Lớp search::FlannSearch là một lớp FLANN cho giao diện tìm kiếm. Mặc định lớp này tạo ra một kd-tree đơn và đánh chỉ mục cho dữ liệu đầu vào. Với kích thước chiều cao (>10), tốt hơn nên sử dụng nhiều chỉ mục kd-tree ngẫu nhiên được cung cấp bởi FLANN kết hợp với khoảng cách flann::L2. Trong khi tìm kiếm trong các
loại chỉ mục này, số lượng kiểm tra để thực hiện trước khi kết thúc tìm kiếm có thể được kiểm soát. Ví dụ về tìm kiếm điểm cao 2-NN:
// Loại đặc trưng và khoảng cách
typedef SHOT352 FeatureT;
typedef flann::L2<float> DistanceT;
// Các loại tìm kiếm và chỉ mục
typedef search::FlannSearch<FeatureT, DistanceT> SearchT; typedef typename SearchT::FlannIndexCreatorPtr CreatorPtrT; typedef typename SearchT::KdTreeMultiIndexCreator IndexT;
typedef typename SearchT::PointRepresentationPtr RepresentationPtrT;
// Các đặc trưng
PointCloud<FeatureT>::Ptr query, target;
//Đưa thông tin truy vấn và đích với các đặc trưng được tính toán //Tìm kiếm đối tượng với 4 cây ngẫu nhiên và 256 lần kiểm tra
SearchT search (true, CreatorPtrT (new IndexT (4))); search.setPointRepresentation (RepresentationPtrT (new DefaultFeatureRepresentation<FeatureT>)); search.setChecks (256); search.setInputCloud (target); // Thực hiện tìm kiếm std::vector<std::vector<int> > k_indices; std::vector<std::vector<float> > k_sqr_distances;
search.nearestKSearch (*query, std::vector<int> (), 2, k_indices, k_sqr_distances);
Biểu đồ kế thừa:
Hình 2.17: Biểu đồ kế thừa lớp pcl::search::FlannSearch
Biểu đồ cộng tác:
Hình 2.18: Biểu đồ cộng tác lớp pcl::search::FlannSearch
3. pcl::search::KdTree< PointT, Tree >
Biểu đồ kế thừa:
Biểu đồ cộng tác:
Hình 2.20: Biều đồ cộng tác lớp pcl::search::KdTree
Lớp search::KdTree là một lớp wrapper mà kế thừa lớp PCL::KdTree để thực hiện chức năng tìm kiếm bằng cách sử dụng cấu trúc KdTree.
KdTree là một loại tổng quát của bộ định vị không gian ba chiều sử dụng cấu
trúc Kd-Tree sử dụng FLANN.
4. pcl::search::Octree< PointT, LeafTWrap, BranchTWrap, OctreeT >
Biểu đồ kế thừa:
Hình 2.21: Biểu đồ kế thừa lớp pcl::search::Octree
Biểu đồ cộng tác:
Lớp search::Octree thực hiện việc tìm kiếm láng giềng gần nhất dựa trên lớp
pcl::octree::Octree.
Lớp octree cần phải được khởi tạo với độ phân dải điểm ảnh ba chiều của nó. Biên của nó sẽ tự động điều chỉnh theo chiều hướng của point cloud hoặc nó có thể được định nghĩa trước (Chiều sâu của cây tương đương với độ phân giải và kích thước khung giới hạn của octree).
Typename: PointT : là loại điểm sử dụng trong pointcloud.
Typename: LeafT: lớp điểm lá (mẫu thông thường với giá trị chỉ số nguyên).
Typename: OctreeT: thực hiện octree().
5. pcl::search::OrganizedNeighbor< PointT >
Biểu đồ kế thừa:
Hình 2.23: Biều đồ kế thừa lớp pcl::search::OrganizedNeighbor
Biểu đồ cộng tác:
Hình 2.24: Biểu đồ cộng tác lớp pcl::search::OrganizedNeighbor
OrganizedNeighbor là một lớp để tối ưu hóa tìm kiếm láng giềng gần nhất trong một tổ chức point clouds.
6. pcl::search::Search< PointT >
Mỗi phương pháp tìm kiếm phải được thực thi 2 loại khác nhau của tìm kiếm:
nearestKSearch: tìm kiếm K láng giềng gần nhất.
radiusSearch: tìm kiếm cho tất cả láng giềng gần nhất trong một bán cầu có bán kính nhất định.
Đầu vào cho mỗi phương pháp tìm kiếm có thể lấy ra từ 3 các khác nhau:
như truy vấn điểm.
như một cặp (cloud, index).
như một index.
Đối với lựa chọn sau thì giả định rằng người sử dụng quy định các đầu vào thông qua phương pháp setInputCloud() trước tiên.
Trong trường hợp lỗi, tất cả các phương pháp được hỗ trợ trả về giá trị 0 như là số điểm láng giềng được tìm thấy.
2.3.2. Mô đun Kdtree
1. pcl::KdTree< PointT >
Kdtree mô tả lớp định vị không gian cơ sở cho việc thực thi kd-tree. Biểu đồ cộng tác:
2. pcl::KdTreeFLANN< PointT, Dist >
KdTreeFLANN là một loại tổng quát của định vị không gian 3 chiều sử dụng cấu trúc kD-tree.
Biểu đồ kế thừa:
Hình 2.27: Biểu đồ kế thừa lớp pcl::KdTreeFLANN
Biểu đồ cộng tác:
Hình 2.28: Biều đồ cộng tác lớp pcl::KdTreeFLANN
2.3.3. Mô đun octree
1. pcl::octree::Octree2BufBase< LeafContainerT, BranchContainerT >
Lớp bộ đệm kép Octree thực hiện việc phân tách giữa 2 cấu trúc octree trong bộ nhớ, nó cho phép so sánh giữa các cấu trúc octree khác nhau (phát hiện thay đổi, mã hóa khác).
Độ sâu của cây xác định số lượng tối đa của octree điểm ảnh ba chiều / nút lá (được xác định ban đầu). Tất cả các nút lá được đánh địa chỉ bởi các chỉ số nguyên. Độ sâu của cây tương đương với chiều dài bit của các chỉ số điểm ảnh ba chiều.
Biểu đồ kế thừa:
Hình 2.29: Biều đồ kế thừa lớp pcl::octree::Octree2BufBase
Biểu đồ cộng tác:
Hình 2.30: Biều đồ cộng tác lớp pcl::octree::Octree2BufBase
2. pcl::octree::OctreeBase< LeafContainerT, BranchContainerT >
Độ sâu của cây xác định số lượng tối đa của octree điểm ảnh ba chiều / nút lá (được xác định ban đâu).
Tất cả các nút lá được đánh địa chỉ bằng các chỉ số nguyên.
Độ sâu của cây tương đương với chiều dài bit của các chủ số voxel. Biểu đồ kế thừa:
Biểu đồ cộng tác:
Hình 2.32: Biều đồ cộng tác lớp pcl::octree::OctreeBase
3. pcl::octree::OctreeIteratorBase< OctreeT >
Lớp cơ sở lặp Octree Biểu đồ kế thừa:
Hình 2.33: Biểu đồ kế thừa lớp pcl::octree::OctreeIteratorBase
Biểu đồ cộng tác:
4. pcl::octree::OctreeDepthFirstIterator< OctreeT >
Lớp bộ lặp Octree thực hiện chuyển bộ lặp qua các octree trong theo chiều sâu. Biểu đồ kế thừa:
Hình 2.35: Biểu đồ kế thừa lớp pcl::octree::OctreeDepthFirstIterator
Biểu đồ cộng tác:
Hình 2.36: Biểu đồ cộng tác lớp pcl::octree::OctreeDepthFirstIterator
5. pcl::octree::OctreeBreadthFirstIterator< OctreeT >
Lớp bộ lặp Octree thực hiện chuyển bộ lặp qua các octree trong theo chiều rộng. Biểu đồ kế thừa:
Hình 2.37: Biều đồ kế thừa lớp pcl::octree::OctreeBreadthFirstIterator
Biểu đồ cộng tác:
6. pcl::octree::OctreeLeafNodeIterator< OctreeT >
Lớp bộ lặp theo nút lá thực hiện chuyển bộ lặp qua các nút lá của một cấu trúc dữ liệu Octree.
Biểu đồ kế thừa:
Hình 2.39: Biểu đồ kế thừa lớp pcl::octree::OctreeLeafNodeIterator
Biểu đồ cộng tác:
Hình 2.40: Biểu đồ cộng tác lớp pcl::octree::OctreeLeafNodeIterator
7. pcl::octree::OctreePointCloud< PointT, LeafContainerT, BranchContainerT, OctreeT >
Với thuật toán này các chỉ số được lưu trữ bởi các nút lá (zero-copy). Lớp
OctreePointCloud cần được khởi tạo với độ phân giải điểm ảnh ba chiều của nó.
Khung giới hạn của nó được tự động điều chỉnh theo kích thước pointcloud hoặc nó có thể được xác định trước. Độ sâu của cây tương đương vơi độ phân giải và kích thước khung giới hạn của Octree.
Một số typename thường sử dụng:
typename: PointT: Loại điểm được sử dụng trong pointcloud
typename: LeafContainerT: nút lá chứa (
typename: BranchContainerT: nhánh nút chứa
Biểu đồ kế thừa:
Hình 2.41: Biểu đồ kế thừa lớp pcl::octree::OctreePointCloud
Biều đồ cộng tác:
Hình 2.42: Biều đồ cộng tác lớp pcl::octree::OctreePointCloud
8. pcl::octree::OctreePointCloudAdjacency< PointT, LeafContainerT, BranchContainerT >
Lớp điểm ảnh ba chiều octree sẽ duy trì thông tin cho các điểm ảnh ba chiều gần nó. Lớp OctreePointCloud tạo ra một octree từ một point cloud (zero-copy).Các octree pointcloud được khởi tạo với độ phân giải điểm ảnh ba chiều của nó. Khung giới hạn của nó được tự động điều chỉnh hoặc có thể được xác định trước.
Lớp OctreePointCloudAdjacencyContainer có thể được sử dụng để lưu trữ dữ liệu trong các nút lá. Một hàm chuyển đổi có thể được cung cấp nhằm thay đổi lưới
điểm ảnh ba chiều được tính, điều này có thể được sử dụng để tạo ra các kho điểm ảnh ba chiều lớn hơn khi chúng ta tăng khoảng cách nguồn (máy ảnh).
Biểu đồ kế thừa:
Hình 2.43: Biều đồ kế thừa lớp pcl::octree::OctreePointCloudAdjacency
Biểu đồ cộng tác:
Hình 2.44: Biểu đồ cộng tác lớp pcl::octree::OctreePointCloudAdjacency
9. pcl::octree::OctreePointCloudChangeDetector< PointT, LeafContainerT, BranchContainerT >
Lớp phát hiện thay đổi OctreePointCloudChangeDetector.
Lớp OctreePointCloudChangeDetector tạo ra một octree từ một đám mây điểm ảnh (bản sao rỗng). Nó cho phép phát hiện các nút lá mới và thứ tự các chỉ số của chúng. Lớp này được khởi tạo với độ phân giải điểm ảnh ba chiều của nó. Khung giới hạn của nó được tự động điều chỉnh hoặc có thể được xác định trước.
Typename được sử dụng: PointT. Biểu đồ kế thừa:
Hình 2.45: Biểu đồ kế thừa lớp pcl::octree::OctreePointCloudChangeDetector
Biểu đồ cộng tác:
11. pcl::octree::OctreePointCloudDensity< PointT, LeafContainerT, BranchContainerT >
Lớp OctreePointCloudDensity: Lớp này tạo ra một octree từ một đám mây điểm ảnh (bản sao rỗng). Chỉ số lượng các điểm mà rơi vào các nút là điểm ảnh ba chiều mới được lưu trữ.
Biểu đồ kế thừa:
Hình 2.47: Biểu đồ kế thừa lớp pcl::octree::OctreePointCloudDensity
Biều đồ cộng tác:
Hình 2.48: Biểu đồ cộng tác lớp pcl::octree::OctreePointCloudDensity
12. pcl::octree::OctreePointCloudOccupancy< PointT, LeafContainerT, BranchContainerT >
Lớp OctreePointCloudOccupancy tạo ra một octree từ một đám mây điểm ảnh (bản sao rỗng). Không có thông tin nào được lưu trữ tại các nút đầu. Nó có thể được sử dụng kiểm tra các lưu giữ.
Biểu đồ kế thừa:
Hình 2.49: Biểu đồ kế thừa lớp pcl::octree::OctreePointCloudOccupancy
Biểu đồ cộng tác:
13. pcl::octree::OctreePointCloudPointVector< PointT, LeafContainerT, BranchContainerT, OctreeT >
Lớp OctreePointCloudPointVector: tạo ra một octree từ một đám mây điểm ảnh (bản sao rỗng). Mỗi nút lá chứa một danh sách các chỉ số điểm của các tập dữ liệu được đưa ra bởi setInputCloud.
Biểu đồ kế thừa:
Hình 2.51: Biểu đồ kế thừa lớp pcl::octree::OctreePointCloudPointVector
Biểu đồ cộng tác:
Hình 2.52: Biểu đồ cộng tác lớp pcl::octree::OctreePointCloudPointVector
14. pcl::octree::OctreePointCloudSinglePoint< PointT, LeafContainerT, BranchContainerT, OctreeT >
Lớp OctreePointCloudSinglePoint: tạo ra một octree từ một đám mấy điểm ảnh (bản sao rỗng). Mỗi nút lá chứa một chỉ số điểm đơn từ các tập dữ liệu được đưa ra bởi setInputCloud.
Biểu đồ kế thừa:
Hình 2.53: Biểu đồ kế thừa lớp pcl::octree::OctreePointCloudSinglePoint
Biểu đồ cộng tác:
15. pcl::octree::OctreePointCloudVoxelCentroid< PointT, LeafContainerT, BranchContainerT >
Lớp OctreePointCloudVoxelCentroid: tạo ra một octree từ một đám mây điểm ảnh (bản sao rỗng) và đưa ra một vector của trọng tâm cho tất cả các điểm ảnh ba chiều được chiếm giữ.
Biểu đồ kế thừa:
Hình 2.55: Biều đồ kế thừa lớp pcl::octree::OctreePointCloudVoxelCentroid
Biểu đồ cộng tác:
Hình 2.56: Biểu đồ cộng tác lớp pcl::octree::OctreePointCloudVoxelCentroid
16. pcl::octree::OctreePointCloudSearch< PointT, LeafContainerT, BranchContainerT >
Lớp OctreePointCloudSearch: cung cấp một số phương pháp để tìm kiếm
không gian láng giềng dựa trên cấu trúc octree. Biểu đồ kế thừa:
Hình 2.57: Biểu đồ kế thừa lớp pcl::octree::OctreePointCloudSearch
Biều đồ cộng tác:
2.3.4. Mô đun phân vùng đối tượng
1. pcl::gpu::EuclideanClusterExtraction
Lớp EuclideanClusterExtraction mô tả một lớp cho trích chọn phân nhóm trong một không gian ơ clit, phụ thuộc vào pcl::gpu::octree
Biểu đồ cộng tác:
Hình 2.59: Biểu đồ cộng tác lớp pcl::gpu::EuclideanClusterExtraction
2. pcl::gpu::EuclideanLabeledClusterExtraction< PointT >
Lớp này mô tả một lớp cho trích chọn phân nhóm trong một không gian ơ clit, phụ thuộc vào pcl::gpu::octree.
Biểu đồ cộng tác:
3. pcl::LabeledEuclideanClusterExtraction< PointT >
ConditionalEuclideanClustering thực hiện việc phân vùng dựa trên khoảng cách Euclidean và điều kiện phân nhóm của người sử dụng định nghĩa.
Biểu đồ kế thừa và cộng tác:
Hình 2.61: Biểu đồ cộng tác lớp pcl::LabeledEuclideanClusterExtraction
4. pcl::LabeledEuclideanClusterExtraction< PointT >
LabeledEuclideanClusterExtraction mô tả một lớp cho trích chọn phân nhóm
trong một không gian ơ clit có thông tin nhãn. Biểu đồ kế thừa và cộng tác:
Hình 2.62: Biểu đồ cộng tác lớp pcl::LabeledEuclideanClusterExtraction
5. pcl::ExtractPolygonalPrismData< PointT >
ExtractPolygonalPrismData sử dụng một tập các chỉ số điểm để mô tả một mô
hình mặt phẳng và kết hợp vơi thông tin chiều cao để tạo ra một lăng kính ba chiều. Lăng kính này được sử dụng để phân vùng tất cả các điểm nằm trong nó.
Biểu đồ kế thừa và công tác:
Hình 2.63: Biểu đồ cộng tác lớp pcl::ExtractPolygonalPrismData
Ví dụ về việc sử dụng phương pháp này để trích chọn ra dữ liệu bên trong một tập các đường bao ba chiều (các đối tượng hỗ trợ trong mô hình phẳng):
double z_min = 0., z_max = 0.05; //Tạo các điểm trên mặt phẳng, không quá 5cm
pcl::PointCloud<pcl::PointXYZ>::Ptr hull_points (new
pcl::PointCloud<pcl::PointXYZ> ()); pcl::ConvexHull<pcl::PointXYZ> hull;
// hull.setDimension (2); // Không cần thiết, được sử dụng để kiểm tra chiều của đầu ra
hull.setInputCloud (cloud); hull.reconstruct (hull_points);
if (hull.getDimension () == 2) {
pcl::ExtractPolygonalPrismData<pcl::PointXYZ> prism; prism.setInputCloud (point_cloud);
prism.setInputPlanarHull (hull_points); prism.setHeightLimits (z_min, z_max); prism.segment (cloud_indices);
}
else
PCL_ERROR ("The input cloud does not represent a planar surface.\n");
6. pcl::GrabCut< PointT >
Biểu đồ kế thừa của pcl::GrabCut< PointT >
Hình 2.64: Biểu đồ kế thừa lớp pcl::GrabCut