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
Biểu đồ cộng tác của pcl::GrabCut< PointT >
Hình 2.65: Biều đồ cộng tác lớp pcl::GrabCut
7. pcl::segmentation::detail::RandomWalker<Graph, EdgeWeightMap, VertexColorMap >
Phân vùng đồ thị đa nhãn sử dụng trong quãng đường ngẫu nhiên. Đây là việc thực thi thuật toán "Random Walks".
8. pcl::LCCPSegmentation< PointT >
Một thuật toán phân cùng đơn giản phân chia một đồ thị supervoxel thành các nhóm supervoxels địa phương lồi được kết nối với nhau bằng các đường viền lõm.
9. pcl::SegmentDifferences< PointT >
Mô hình kế thừa và cộng tác
Hình 2.66: Biểu đồ cộng tác lớp pcl::SegmentDifferences
Lớp SegmentDifferences chứa sự khác nhau giữa 2 đám mây điểm phẳng và trả về sự khác biệt giữa chúng từ đó đưa ra được khoảng cách ngưỡng cực đại.
10. pcl::SACSegmentation< PointT >
SACSegmentation mô tả lớp phân vùng Nodelet cho các phương pháp và mô
hình đồng mẫu, trong không gian thì nó chỉ tạo ra môt đường bao bọc Nodelet cho mục đích chung là phân vùng dựa trên SAC.
Biểu đồ kế thừa của pcl::SACSegmentation< PointT >:
Hình 2.67: Biểu đồ kế thừa lớp pcl::SACSegmentation
11. pcl::SupervoxelClustering< PointT >
Thực thi thuật toán supervoxel dựa trên cấu trúc, pháp tuyến, và giá trị rgb của các điểm ảnh ba chiều.
Mô hình kế thừa:
Hình 2.69: Biểu đồ cộng tác lớp pcl::SupervoxelClustering
12. pcl::SACSegmentationFromNormals< PointT, PointNT >
SACSegmentationFromNormals mô tả lớp phân vùng PCL nodelet cho phương pháp và mô hình đồng mẫu đòi hỏi việc sử dụng các tuyến bề mặt để ước lượng.
Mô hình kế thừa:
Hình 2.70: Biểu đồ kế thừa lớp pcl::SACSegmentationFromNormals
CHƯƠNG 3 - MỘT SỐ THUẬT TOÁN PHÂN VÙNG ĐỐI TƯỢNG 3.1. Thuật toán RANSAC
RANSAC [2] là giải thuật ước lượng mô hình toán học từ một tập hợp các điểm có chứa nhiễu. Giải thuật này lần đầu được công bố vào năm 1981 bởi Fischler và Bolles.
Hình 3.1: Mô tả thuật toán RANSAC
Hình trên cho ta thấy ứng dụng thuật toán RANSAC tìm mô hình đường thẳng (có dạng ax + by + c = 0) trong một tập hợp các điểm có chứa nhiễu.
Giải thuật tìm đường thẳng bằng thuật toán RANSAC được mô tả như sau:
Đầu vào:
data - tập hợp các điểm
k - số lần lặp
t - ngưỡng sai số để xác định điểm nào đó có khớp mô hình không
Đầu ra:
best_model - mô hình tốt nhất
best_consensus_set - tập hợp các điểm khớp với best_model
best_consensus_set = null
best_num_points = 0
Lặp k lần:
consensus_set = tập hợp 2 điểm ngẫu nhiên thuộc data
model = mô hình đường thẳng suy ra từ 2 điểm trên Với mỗi điểm thuộc data nhưng không thuộc consensus_set, ta xét:
distance = khoảng cách từ điểm đến đường thẳng;
if distance < t (điểm thuộc mô hình nếu sai số nhỏ hơn mức ngưỡng đặt trước) thêm điểm đó vào consensus_set
num_points = số lượng phần tử trong consensus_set
if num_points > best_num_points best_model = model
best_consensus_set = consensus_set best_num_points = num_points
Trả về giá trị: best_model và best_consensus_set
Bảng 3.1: Bảng mô tả thuật toán RANSAC
Với mô hình mặt phẳng α có dạng ax + by + cz + d =0, thuật toán RANSAC cũng làm được điều tương tự như đối với mô hình đường thẳng, thay vì chọn hai điểm bất kỳ để tìm mô hình thì mặt phẳng cần ba điểm.
3.2. Thuật toán LMEDS
Phương pháp tối thiểu trung bình bình phương [4] ước lượng các thông số bằng cách giảm thiểu phi tuyến:
min med
𝑖 𝑟2𝑖 (1)
Ước lượng phải mạng lại giá trị nhỏ nhất cho các trung bình phần dư bình phương tính toán cho toàn bộ dữ liệu. Phương pháp này rất phù hợp với giá trị nhiễu do địa hình xấu. Thuật toán LMEDS không thể giảm trọng số bình phương nhỏ nhất do không thể viết ra một công thức đơn giản cho việc ước lượng LMedS. Nó phải
được giải quyết bằng cách tìm kiếm trong không gian của các ướng ước lượng có thể được tạo ra từ dữ liệu. Ngay cả khi không gian này quá lớn, thì chỉ một tập con của nó được chọn ngẫu nhiên các dữ liệu có thể được phân tích.
Thuật toán được mô tả như sau: Cho n điểm : {mi = [xi, yi]T}.
1. Công nghệ Monte Carlo được sử dụng để vẽ m mẫu ngẫu nhiên của p điểm khác nhau.
2. Đối với mỗi mẫu con, được đánh chỉ số bởi J, chúng ta sử dụng bất kỳ kỹ thuật nào để tính toán cá thông số hình nón PJ.
3. Với mỗi PJ, chúng ta cần xác định trung bình của các số dư bình phương, ký hiệu là MJ, đối với toàn bộ các điểm:
MJ = med
𝑖=1,…,𝑛𝑟2𝑖(pJ,mj). (2)
Ở đây ta có một số lựa chọn cho 𝑟2𝑖(pJ,mj), phần dư của điểm I với xác suất PJ. Tùy thuộc vào đòi hỏi độ chính các xác, yêu cầu tính toán, … ta có thể sử dụng khoảng cách đại số, khoảng các ở clit, hoặc khoảng cách trọng số gradient.
4. Ta giữ lại ước lượng PJ mà MJ là tối thiểu nhỏ nhất trong m điểm MJ. Câu hỏi đưa ra là làm sao để xác định được m? Một mẫu con là tốt nếu nó chứa p điểm dữ liệu tốt. Giả sử toàn ε tỷ lệ mẫu dữ liệu chứa nhiễu , xác suất có ít nhật một trong các mẫu con m là tốt được cho bởi:
P = 1 – [1 – (1- ε)p]m. (3)
Với P ~ 1, ta có thể xác định được m qua các giá trị của p và ε:
𝑚 = log [1−(1−𝜀)log (1−𝑃)𝑝] (4)
Ở trong việc thực hiện trên, ta giả định ε = 40% và yêu cầu P = 0.99, thì m = 57. Lưu ý rằng thuật toán có thể được tăng nhanh đáng kể bằng các phương tiện tính toán song song, vì vậy việc sử lý đối với từng mẫu của nó có thề được thực hiện một cách độc lập.
Hiệu quả của thuật toán LMedS sẽ rất thấp nếu có sự xuất hiện của nhiễu Gaussian. Hiệu quả của phương pháp này được định nghĩa là tỷ số giữa phương sai thấp nhất có thể đạt được cho các thông sô ước lượng và phương sai thực tế được cung cấp bởi các phương pháp nhất định. Để bù vào cho sự thiếu hụt này, ta tiếp tục thực hiện một thủ tục bình phương nhỏ nhất trọng số. Ước lượng độ lệch tiêu chuẩn được cho bởi:
σ = 1.4826 [1 + 5/(n - p)]√𝑀 𝐽, (5) Với MJ là trung bình nhỏ nhất.
Hằng số 1.4826 là hệ số để đạt được hiệu quả tương tự như một bình phương nhỏ nhất với sự có mặt của nhiễu Gaussian.
5/(n-p) để bù lại hiệu quả của một tập dữ liệu nhỏ.
Dựa trên giá trị σ, chúng ta có thể gán một trọng số cho mỗi giá trị tương ứng:
𝑤 𝑖 = { 1, 𝑛ế𝑢 𝑟2𝑖 ≤ (2.5𝜎) 2
0, (6)
Với ri là phần còn lại của i điểm với nón p. Tương ứng với wi = 0 là các điểm bên ngoài và không nên tiếp tục dưa vào. Nón p là ước lượng cuối cùng bởi việc giải quyết vấn để bình phương nhỏ nhất trọng số:
min
𝑝 = ∑ 𝑤𝑖 𝑖 𝑟2𝑖 (7)
Sử dụng một trong những kỹ thuật được mô tả trên, chúng ta sẽ có phương pháp mạnh để ước lượng nón bởi vì các giá trị ngoại lai được xác định và loại bỏ bởi phương pháp LMedS.
Như đã đề cập ở trên, tính hiệu quả của phương pháp LMedS có thể đạt được bằng cách áp dụng kỹ thuật Monte-Carlo. Tuy nhiên, năm điểm của một mẫu con thậm chí có thể được tạo ra rất gần nhau. Trong tình huống như vậy nên tránh bởi vì ước lượng conic từ các điểm đó rất không ổn định và kết quả gần như là không hữu dụng. Việc đó gây ra sự lãng phí thời gian đánh giá một mẫu con. Để đạt được sự ổn
định cao hơn và hiệu quả hơn, ta cần phát triển một phương pháp lựa chọn ngẫu nhiên dựa trên công nghệ bucking, với phương thực hoạt động như sau: Trước tiên ta tính toán giá trị min và max của các tọa độ điểm trong ảnh đầu tiên. Vùng này được chia đều vào trong một thùng bxb ô (xem hình 3.2, với b=8). Để mỗi nhóm được đính kèm một tập các điểm. Các thùng mà không có các điểm gắn vào phù hợp sẽ bị loại. Để tạo ra một mẫu 5 điểm, trước tiên ta cần chọn ngẫu nhiên 5 thùng, và sau đó chọn ra ngẫu nhiên một điểm trong mỗi thùng được chọn.
Hình 3.2: Ví dụ về công nghệ thùng điểm
Vấn đề là cần bao nhiêu mẫu con? Ta giả định điểm xấu được phân bố đều trong không gian, và nếu mỗi thùng có cùng số điểm và lựa chọn ngẫu nhiên là thống nhất thì công thức (P = 1 – [1 – (1- ε)p]m) vẫn giữ. Tuy nhiên, số lượng các điểm trong một thùng có thể khác nhau từ các thùng khác. Kết quả là, một điểm thuộc 1 thùng có ít điểm hơn xác suất điểm được chọn. Do đó một thùng có nhiều điểm có xác suất cao hơn sẽ được chọn hơn so với thùng chỉ có một vài điểm, để mỗi điểm gần như có cùng một xác suất được lựa chọn.
Ta có thể hình dung bởi thủ tục sau:
Nếu ta có l thùng, ta chia [0 1] vào trong khoảng l với độ rộng của khoảng thứ i là ni/i ni, với ni là số điểm gắn với thùng thứ i (Hình 3.3). Trong thủ tục lựa chọn
thùng, một số, được tạo ra ngẫu nhiên trong đoạn [0 1], rơi vào khoảng thứ I nghĩa là thùng thứ I được lựa chọn.
Hình 3.3: Bản đồ thùng và ước lượng khoảng
Kỹ thuật này sử dụng để khớp giữa hai ảnh chưa được hiệu chỉnh. Ý tưởng của phương pháp này là sử dụng các kỹ thuật cổ điển (phương pháp tương quan và suy giảm) để tìm một tập phù hợp ban đầu và sau đó sử dụng phương pháp Least Median of Squares (LMedS) để loại bỏ các điểm lỗi trong tập này. Hình học epipolar sau đó có thể được ước lượng một các chính xác sử dụng một chuẩn hình ảnh có ý nghĩa.
CHƯƠNG 4 - XÂY DỰNG VÀ CÀI ĐẶT THỬ NGHIỆM 4.1. Các mô hình phân vùng
4.1.1. Phân vùng theo mô hình phẳng
Trong mô hình này sẽ thực hiện tách các đám mây điểm ảnh có cấu trúc phẳng, sau đó tách ra đám mây điểm ảnh có tổng số điểm lớn nhất, bằng giải thuật RANSAC. Tạo cấu trúc đám mây điểm ảnh, đưa vào các giá trị tương ứng và hiển thị nôi dung trên màn hình. Ở đây có thêm một số giá khoảng lệch trong các dữ liệu bằng các thiết lập các giá trị z khác 0.
// Đưa thông tin vào dữ liệu đám mây điểm ảnh cloud->width = 15;
cloud->height = 1;
cloud->points.resize (cloud->width * cloud->height); // Tạo dữ liệu
for (size_t i = 0; i < cloud->points.size (); ++i) {
cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f); cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f); cloud->points[i].z = 1.0; } // Đặt các khoảng lệch cloud->points[0].z = 2.0; cloud->points[3].z = -2.0; cloud->points[6].z = 4.0;
Bảng 4.1: Bảng mô tả đầu vào thuật toán phân vùng mô hình phẳng
Tạo đối tượng SACSegmentation và xây dựng mô hình và phương pháp. Tại đây cũng chỉ ra “ngưỡng khoảng cách”, là giá trị xác định một điểm gần như được coi như là một điểm nhô. Trong chương trình này sử dụng phương pháp RANSAC (pcl::SAC_RANSAC) bởi sử đợn giản của phương pháp này.
pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
// Tạo đối tượng phân vùng
pcl::SACSegmentation<pcl::PointXYZ> seg; // Tùy chọn seg.setOptimizeCoefficients (true); // Thực hiện phân vùng seg.setModelType (pcl::SACMODEL_PLANE); seg.setMethodType (pcl::SAC_RANSAC); seg.setDistanceThreshold (0.01); seg.setInputCloud (cloud);
seg.segment (*inliers, *coefficients);
Bảng 4.2: Bảng mô tả thuật toán phân vùng mô hình phẳng
Hiển thị các nội dùng của tập nhô, cùng với các tham số mặt phẳng được ước lượng (trong mẫu ax + by + cz = 0).
std::cerr << "Model coefficients: " << coefficients->values[0] << " " << coefficients->values[1] << " "
<< coefficients->values[2] << " " << coefficients->values[3] << std::endl;
Bảng 4.3: Bảng mô tả kết quả thuật toán phân vùng mô hình phẳng
Kết quả chương trình có dạng:
Point cloud data: 15 points 0.352222 -0.151883 2 -0.106395 -0.397406 1 -0.473106 0.292602 1 -0.731898 0.667105 -2 0.441304 -0.734766 1 0.854581 -0.0361733 1
-0.4607 -0.277468 4 -0.916762 0.183749 1 0.968809 0.512055 1 -0.998983 -0.463871 1 0.691785 0.716053 1 0.525135 -0.523004 1 0.439387 0.56706 1 0.905417 -0.579787 1 0.898706 -0.504929 1
[pcl::SACSegmentation::initSAC] Setting the maximum number of iterations to 50 Model coefficients: 0 0 1 -1 Model inliers: 12 1 -0.106395 -0.397406 1 2 -0.473106 0.292602 1 4 0.441304 -0.734766 1 5 0.854581 -0.0361733 1 7 -0.916762 0.183749 1 8 0.968809 0.512055 1 9 -0.998983 -0.463871 1 10 0.691785 0.716053 1 11 0.525135 -0.523004 1 12 0.439387 0.56706 1 13 0.905417 -0.579787 1 14 0.898706 -0.504929 1
Kết quả hiển thị của việc xử lý phân vùng:
Hình 4.1: Kết quả xử lý phân vùng theo mô hình phẳng
Các trục tọa độ được biểu diễn như là màu đỏ (x), màu xanh lá cây (y), và màu xanh da trời (z). Các điểm được thể hiện bằng màu đỏ như là các giá trị ngoại lai, và màu xanh lá cây là điểm nhô của mô hình mặt phẳng được tìm thấy.
4.1.2. Phân vùng theo mô hình trụ
Chương trình thực hiên phân vùng đối tượng cho mô hình trụ, được áp dùng cho tập số liệu đầu vào như sau:
Các điểm dữ liệu xa hơn 1,5 mét được lọc.
Bề mặt tại mỗi điểm đã được ước lượng
Một mô hình phẳng (mô tả các bảng trong bộ dữ liệu) được phân vùng và lưu vào đĩa.
Mô hình trụ (mô tả các cốc trong bộ dữ liệu) được phân vùng và lưu vào đĩa. Chương trình sử dụng một bộ ước lượng RANSAC để có được các hệ số trụ, và áp đặt một ngưỡng khoảng cách từ mỗi điểm nhô đến mô hình (≤ 5cm). Ngoài ra
chương trình thiết lập các tuyến bề mặt ảnh hưởng đến trọng số 0,1 và giới hạn bán kính của mô hình trụ nhỏ hơn 10 cm.
Kết quả chương trình:
PointCloud has: 307200 data points.
PointCloud after filtering has: 139897 data points.
[pcl::SACSegmentationFromNormals::initSACModel] Using a model of type: SACMODEL_NORMAL_PLANE
[pcl::SACSegmentationFromNormals::initSACModel] Setting normal distance weight to 0.100000
[pcl::SACSegmentationFromNormals::initSAC] Using a method of type: SAC_RANSAC with a model threshold of 0.030000
[pcl::SACSegmentationFromNormals::initSAC] Setting the maximum number of iterations to 100
Plane coefficients: header: seq: 0 stamp: 0.000000000 frame_id: values[] values[0]: -0.0161854 values[1]: 0.837724 values[2]: 0.545855 values[3]: -0.528787
PointCloud representing the planar component: 117410 data points.
[pcl::SACSegmentationFromNormals::initSACModel] Using a model of type: SACMODEL_CYLINDER
[pcl::SACSegmentationFromNormals::initSACModel] Setting radius limits to 0.000000/0.100000
[pcl::SACSegmentationFromNormals::initSACModel] Setting normal distance weight to 0.100000
[pcl::SACSegmentationFromNormals::initSAC] Using a method of type: SAC_RANSAC with a model threshold of 0.050000
[pcl::SampleConsensusModelCylinder::optimizeModelCoefficients] LM solver finished with exit code 2, having a residual norm of 0.322616.
Initial solution: 0.0452105 0.0924601 0.790215 0.20495 -0.721649 -0.661225 0.0422902
Final solution: 0.0452105 0.0924601 0.790215 0.20495 -0.721649 -0.661225 0.0396354
Cylinder coefficients: header: seq: 0 stamp: 0.000000000 frame_id: values[] values[0]: 0.0452105 values[1]: 0.0924601 values[2]: 0.790215