Nokta Bulutu Kütüphanesi ( PCL ), 2D / 3D görüntü ve nokta bulut işlemesi için bağımsız ve geniş çaplı, açık bir projedir. PCL, BSD lisansı şartları altında serbest bırakılır ve bu nedenle ticari ve araştırma amaçlı kullanım için ücretsizdir. Bu proje Filtreleme, özellik tahmini, yüzeyi yeniden yapılandırma, model uydurma ve segmentasyon gibi işlemleri yapabilen bir çok algoritma içerir.
PCL, çapraz platform olup, Linux, MacOS, Windows ve Android / iOS üzerinde başarıyla derlenmiş ve konuşlandırılmıştır. Gelişimi basitleştirmek için, PCL ayrı olarak derlenebilen daha küçük kod kütüphanelerine ayrılmıştır. Bu sayede işlem karmaşıklıkları giderilmiş olur.
PCL Kütüphanesi kim tarafından destekleniyor?
PCL Yükleme
PCL_octree
Pcl_octree kütüphanesi nokta bulutu verilerinden hiyerarşik bir ağaç veri yapısını oluşturmak için etkili bir yöntem sağlar. Her düğüm sekiz çocuğa sahip olabilir ya da hiçbir çocuğu olmayabilir. Kök düğüm tüm noktaları kapsülleyen bir kübik sınırlama kutusu tanımlar. Her ağaç seviyesinde bu alan 2 faktörüne bölünür ve vokselin derinliği artar.
Pcl_octree uygulaması “Voksel Arama içindeki Komşuları”, ‘K Yakın Komşu Arama’ ve ‘Radius Arama içindeki komşular’ gibi yakın komşu arama rutinlerine verimli çözüm sunar. Otomatik olarak nokta veri setine göre kendi boyutunu ayarlar. Yaprak düğüm sınıflarının kümesi Boşluk “doluluk” ve “voksel başına nokta yoğunluğu” gibi ek işlevsellik sağlamaktır. Seri hale getirme ve serisini kaldırma işlevleri, oktree yapısını ikili bir biçimde kodlamak için olanak sağlar. Ayrıca, bir bellek havuzu uygulaması pahalı bellek ayırma ve deallocation işlemlerini azaltır Oktristlerin yüksek oranda oluşturulması gereken senaryolar.
PCL_octree Sınıfları
- class Pcl :: octree :: Octree2BufBase <LeafContainerT, BranchContainerT>
- class Pcl :: octree :: OctreeBase <LeafContainerT, BranchContainerT>
- class Pcl :: octree :: OctreeIteratorBase <OctreeT>
- class Pcl :: octree :: OctreeDepthFirstIterator <OctreeT>
- class Pcl :: octree :: OctreeBreadthFirstIterator <OctreeT>
- class Pcl :: octree :: OctreeLeafNodeIterator <OctreeT>
- class Pcl :: octree :: OctreePointCloud <PointT, LeafContainerT, BranchContainerT, OctreeT>
- class Pcl :: octree :: OctreePointCloudAdjacency <PointT, LeafContainerT, BranchContainerT>
- class Pcl :: octree :: OctreePointCloudChangeDetector <PointT, LeafContainerT, BranchContainerT>
- class Pcl :: octree :: OctreePointCloudDensity <PointT, LeafContainerT, BranchContainerT>
- class Pcl :: octree :: OctreePointCloudOccupancy <PointT, LeafContainerT, BranchContainerT>
- class Pcl :: octree :: OctreePointCloudPointVector <PointT, LeafContainerT, BranchContainerT, OctreeT>
- class Pcl :: octree :: OctreePointCloudSinglePoint <PointT, LeafContainerT, BranchContainerT, OctreeT>
- class Pcl :: octree :: OctreePointCloudVoxelCentroid <PointT, LeafContainerT, BranchContainerT>
- class Pcl :: octree :: OctreePointCloudSearch <PointT, LeafContainerT, BranchContainerT> :: prioBranchQueueEntry
- class Pcl :: octree :: OctreePointCloudSearch <PointT, LeafContainerT, BranchContainerT> :: prioPointQueueEntry
- class Pcl :: octree :: OctreePointCloudSearch <PointT, LeafContainerT, BranchContainerT>
Point Cloud Compression
Nokta bulutları, mesafe, renk, normaller vb. Gibi ek bilgilerle ilişkili üç boyutlu noktaları tanımlayan büyük veri setlerinden oluşur. Ayrıca, yüksek oranda oluşturulabilirler ve dolayısıyla önemli miktarda bellek kaynağı işgal edebilirler. Nokta bulutlarının hız sınırlı iletişim kanalları üzerinden depolanması veya iletilmesi gerektiğinde, bu tür verileri sıkıştırmaya yönelik yöntemler son derece ilginç hale gelir. Point Cloud Library, nokta bulutu sıkıştırma işlevselliği sağlar. Mevcut olmayan nokta referansları, nokta boyutu, çözünürlüğü, yoğunluğu ve / veya nokta sıralamasını değiştirerek karakterize edilen “örgütsüz” nokta bulutları da dahil olmak üzere her türlü nokta bulutunun kodlanmasına izin verir. Dahası, altta sekizli veri yapısı, nokta bulutu verilerini çeşitli kaynaklardan verimli bir şekilde birleştirmeyi sağlar.
Sıkıştırma Profilleri:
Sıkıştırma profilleri, PCL nokta bulutu kodlayıcı için parametre setlerini tanımlar. OpenNI kaptöründen alınan ortak nokta bulutlarının sıkıştırılması için optimize edilmiştir. Kod çözücünün kodlama sırasında kullanılan yapılandırmayı algılar ve benimser şekilde parametreleştirilmesi gerekmez. Aşağıdaki sıkıştırma profilleri mevcuttur:
- LOW_RES_ONLINE_COMPRESSION_WITHOUT_COLOR 1 kübik santimetre çözünürlük, renk yok, hızlı çevrimiçi kodlama
- LOW_RES_ONLINE_COMPRESSION_WITH_COLOR 1 kübik santimetre çözünürlük, renkli, hızlı çevrimiçi kodlama
- MED_RES_ONLINE_COMPRESSION_WITHOUT_COLOR 5 kübik milimetre çözünürlük, renk yok, hızlı çevrimiçi kodlama
- MED_RES_ONLINE_COMPRESSION_WITH_COLOR 5 kübik milimetre çözünürlük, renkli, hızlı çevrimiçi kodlama
- HIGH_RES_ONLINE_COMPRESSION_WITHOUT_COLOR 1 kübik milimetre çözünürlük, renk yok, hızlı çevrimiçi kodlama
- HIGH_RES_ONLINE_COMPRESSION_WITH_COLOR 1 kübik milimetre çözünürlük, renkli, hızlı çevrimiçi kodlama
- LOW_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR 1 kübik santimetre çözünürlük, renk yok, verimli çevrimdışı kodlama
- LOW_RES_OFFLINE_COMPRESSION_WITH_COLOR 1 santimetre küp çözünürlük, renk, verimli çevrimdışı kodlama
- MED_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR 5 kübik milimetre çözünürlük, renk yok, verimli çevrimdışı kodlama
- MED_RES_OFFLINE_COMPRESSION_WITH_COLOR 5 kübik milimetre çözünürlük, renk, verimli çevrimdışı kodlama
- HIGH_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR 1 kübik milimetre çözünürlük, renk yok, verimli çevrimdışı kodlama
- HIGH_RES_OFFLINE_COMPRESSION_WITH_COLOR 1 kübik milimetre çözünürlük, renk, verimli çevrimdışı kodlama
- MANUAL_CONFIGURATION gelişmiş parametrizasyon için manuel yapılandırmayı etkinleştirir
Gelişmiş parametrizasyon şu şekilde açıklanmaktadır:
- CompressionProfile_arg : Bu parametre, gelişmiş parametrizasyonu etkinleştirmek için MANUAL_CONFIGURATION olarak ayarlanmalıdır.
- ShowStatistics_arg : Sıkıştırma ile ilgili istatistikleri stdout’a yazdır.
- PointResolution_arg : Nokta koordinatları için kodlama hassasiyetini tanımlayın. Bu parametre algılayıcı gürültünün altında bir değere ayarlanmalıdır.
- OctreeResolution_arg : Bu parametre dağıtılan sekizliğin voksel boyutunu tanımlar. Daha düşük bir voksel çözünürlüğü daha hızlı sıkıştırmayı, ancak sıkıştırma performansını düşürmeyi sağlar. Bu, yüksek çerçeve / güncelleme oranları ile sıkıştırma etkinliği arasında bir dengeyi sağlar.
- DoVoxelGridDownDownSampling_arg : Etkinleştirilirse yalnızca hiyerarşik oktree veri yapısı kodlanır. Kod çözücü, voksel merkezlerde noktalar üretti. Bu şekilde, yüksek bulanıklık performansı sağlanırken nokta bulutları sıkıştırma sırasında aşağı örneklenir.
- IFrameRate_arg : Nokta bulutu sıkıştırma düzeni puan bulutlarını farklı şekilde kodlar. Bu şekilde, gelen nokta bulutu ile daha önce kodlanmış pointcloud arasındaki farklar, maksimum sıkıştırma performansını arşivlemek için kodlanır. IFrameRate_arg gelen nokta bulutu olan en akışındaki çerçeve hızını belirtmek için kullanılır değildir (video kodlama I / P-çerçeveleri benzeri) diferansiyel olarak kodlanır.
- DoColorEncoding_arg : Bu seçenek renk bileşeni kodlamayı etkinleştirir.
- ColorBitResolution_arg : Bu parametre, kodlanacak renk bileşeni başına bit miktarını tanımlar.
PCL kütüphanesi octree kodu çalıştırma
1) Herhangi bir klasörde bir dizin açıp onun olduğu klasöre gidiyoruz.
2) Build klasörümüzü oluşturuyoruz.
1 | mkdir build |
3) içerisine .cpp, CMakeLists.txt ve .pcd dosyalarımızı atıyoruz.
- CMakeLists.txt’nin içeriği
1 2 3 4 5 6 7 8 9 10 11 12 | cmake_minimum_required(VERSION 2.8 FATAL_ERROR) project(cloud_viewer) find_package(PCL 1.2 REQUIRED) include_directories(${PCL_INCLUDE_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) add_definitions(${PCL_DEFINITIONS}) add_executable (cloud_viewer cloud_viewer.cpp) target_link_libraries (cloud_viewer ${PCL_LIBRARIES}) |
- cloud_viewer.cpp dosyasının içeriği
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <pcl/visualization/cloud_viewer.h> #include <iostream> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h> ///////////////////// #include <pcl/point_cloud.h> #include <pcl/point_types.h> #include <pcl/io/openni_grabber.h> #include <pcl/visualization/cloud_viewer.h> #include <pcl/compression/octree_pointcloud_compression.h> #include <stdio.h> #include <sstream> #include <stdlib.h> #include <pcl/octree/octree.h> #include <vector> #include <ctime> using namespace std; int user_data; void viewerOneOff (pcl::visualization::PCLVisualizer& viewer) { viewer.setBackgroundColor (1.0, 0.5, 1.0); pcl::PointXYZ o; o.x = 1.0; o.y = 0; o.z = 0; viewer.addSphere (o, 0.25, "sphere", 0); std::cout << "i only run once" << std::endl; } void viewerPsycho (pcl::visualization::PCLVisualizer& viewer) { static unsigned count = 0; std::stringstream ss; ss << "Once per viewer loop: " << count++; viewer.removeShape ("text", 0); viewer.addText (ss.str(), 200, 300, "text", 0); //FIXME: possible race condition here: user_data++; } int main () { bool showStatistics = true; pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudEncoder; pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudDecoder; pcl::io::compression_Profiles_e compressionProfile = pcl::io::LOW_RES_OFFLINE_COMPRESSION_WITH_COLOR; // instantiate point cloud compression for encoding and decoding PointCloudEncoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> (compressionProfile, showStatistics); PointCloudDecoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> (); pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>); pcl::io::loadPCDFile ("/home/yapbenzet/Documents/Untitled Folder/samp23-utm-ground.pcd", *cloud); pcl::visualization::CloudViewer viewer("Cloud Viewer"); std::stringstream compressedData; pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloudOut (new pcl::PointCloud<pcl::PointXYZRGBA> ()); // datayı sıkıştırmak için kullanılıyor. PointCloudEncoder->encodePointCloud (cloud, compressedData); PointCloudDecoder->decodePointCloud (compressedData, cloudOut); // Octree için aşağıdaki yorum satırlarını aktif edip yukarıdaki 2 satırı yorum satırı yapmalıyız. /*float resolution = 128.0f; pcl::octree::OctreePointCloudSearch<pcl::PointXYZRGBA> octree (resolution); octree.setInputCloud (cloud); octree.addPointsFromInputCloud ();*/ viewer.showCloud (cloud); viewer.runOnVisualizationThreadOnce (viewerOneOff); viewer.runOnVisualizationThread (viewerPsycho); while (!viewer.wasStopped ()) { user_data++; } return 0; } |
4) Daha sonra cmake işlemini yapıyoruz.
1 | cmake .. |
5) Diğer adım
1 | make |
6) Diğer adım
1 | ./cloud_viewer |