tag:blogger.com,1999:blog-28816293687940171352024-02-08T11:50:25.130+09:00VM LAB得た知識と技術を錆付かせないようにするためのブログ。内容は3次元ビジョン系+α。できるだけ短いコードを書く。更新は不定期Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.comBlogger27125tag:blogger.com,1999:blog-2881629368794017135.post-6914661357709506472015-12-19T20:07:00.001+09:002015-12-19T20:11:07.843+09:00今後の方針 改訂 残念ながらKinectの開発環境は未だできておらず、その目処も立っていない。このままではこのブログを腐らせるだけだと判断したので、しばらくはログの解析などに使用できるコードを作っていこうと思う。<br />
<br />
大掛かりな機械制御のソフトや、コード数が膨大なソフトそのものでは、不具合への対処のために一々プログラムの端から端まで見返すことはできない。そこで予めログを吐き出す機能を実装しておくことによって正常な動作を行っているか、異常が発生したのはどの部分であるのか、を見つけやすくするのがログの役割である。無論このログに記載される情報量も膨大で、必要な情報を取り出す処理が必須となる。(データに対して同じ処理を繰り返すソフトや、同じ品を作り続ける機械などは特に)<br />
<br />
このブログでが、このログの解析の際に、特定の情報を得やすいようなプログラムのコードを書いていこうと思う。<br />
<br />
対象となるログは、一行で一つの情報が完結しているものを取り扱おうと思う。簡単に言うと文字列処理である。これに加えてファイルの処理などのコードも作っていこうと思う。<br />
<br />
大原則は変わらず、できるだけ短いコードを書くAnonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-64022323900935743472015-09-07T21:30:00.003+09:002015-09-13T17:59:36.576+09:003次元情報を取得できるセンサの紹介 Leap motion前回に引き続き3次元情報の取得ができるセンサの紹介を行う<br />
<br />
今回は どちらかというと入力装置としての側面が強いがLeap Motionについて<br />
赤外を照射して物体までの距離情報を取得する。10本の指をそれぞれ認識することが可能で、検知範囲は半径50cmほど、きわめて精度の高い情報を取得することが可能<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://d2ksbrjq7r906x.cloudfront.net/assets/leap-motion-controller-74b73657e7800fe211ef3fa7730690f6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://d2ksbrjq7r906x.cloudfront.net/assets/leap-motion-controller-74b73657e7800fe211ef3fa7730690f6.png" /></a></div>
検知範囲が半径50cmと狭いので環境情報を取得するには厳しいセンサである。しかしこの精度はきわめて魅力的である。さらに価格もKinect並みなので手ごろ、人間の入力機器以外に使うことはできないかとアイディアをずっと考えている。Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-25576381182573642662015-09-07T21:30:00.001+09:002015-09-07T21:30:22.008+09:00生存報告、加えて3次元情報の取得ができるセンサの紹介 Kinectかなり久しぶりの更新で申し訳ない<br />
<br />
相変わらず新しい開発環境の構築はできていないのでPCLを用いた点群処理についての更新は行えない。<br />
なので今回は現在存在する3次元情報を取得できるセンサについて、今後のためにもまとめておこうと思う。<br />
対象はあくまでも3次元なので2次元平面を取得するLaser Range Finder(LRF)のようなセンサは対象外とする。(LRFも複数、もしくは使い方によっては3次元情報は取得可能ではある)<br />
<br />
Kinect<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://hidale.com/wp-content/uploads/2014/08/kinectv1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://hidale.com/wp-content/uploads/2014/08/kinectv1.png" width="320" /></a></div>
もっとも安価な3次元点群を取得可能なセンサー、取得可能な点の数は307200個、各点の色の情報もそれぞれ取得可能である。安価な故精度が若干他のセンサよりも劣る。また307200個の点を取ることは可能だがその約3割~4割は使用不能であることが多い(反射などの関係)。形はまったく同じだがVersion2が存在しており、Version1よりもより近距離の対象の撮影を行うことができる。3次元点群に触れてみたい方にはもっとも安価で手に入れることができるものであると思う。当然Kinectを用いた研究も多くなされており、SLAM、物体認識、人検知、その他、無数の対象に装備されたりしている。<br />
<br />
今回はこれまで<br />
<br />
近々今一度引っ越すのでそこでは開発環境の再構築を行いたいAnonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-61510917582733179482015-03-17T15:51:00.000+09:002015-03-17T15:51:18.748+09:00点群データからHarris特徴量を抽出する <b><a href="http://virtuemarket-lab.blogspot.jp/2015/03/viewpoint-feature-histogram.html" target="_blank">VFH</a></b>、<b><a href="http://virtuemarket-lab.blogspot.jp/2015/03/sift.html" target="_blank">SIFT</a></b>に続いて今回はHarris特徴量を点群から抽出する。Harris特徴量(特徴点とも)は簡単に言えば入力されたデータの角を検出する特徴量である。、このHarris特徴量もSIFT同様PCLでは機能が実装されているので簡単に使うことができる。<br />
<br />
コード<br />
<br />#include "stdafx.h"<br /><br />#include <iostream><br />#include <pcl/io/pcd_io.h><br />#include <pcl/point_types.h><br />#include <pcl/common/io.h><br />#include <pcl/keypoints/harris_keypoint3D.h><br />#include <pcl/visualization/pcl_visualizer.h><br /><br /><br />int _tmain(int argc, _TCHAR* argv[])<br /><br />{<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br /> pcl::io::loadPCDFile<pcl::PointXYZ> (argv[1], *cloud);<br /><br /> pcl::HarrisKeypoint3D<pcl::PointXYZ,pcl::PointXYZI> detector;<br /> detector.setNonMaxSupression (true);<br /> detector.setRadius (0.01);<br /> //detector.setRadiusSearch (100);<br /> detector.setInputCloud(cloud);<br /><br /> pcl::PointCloud<pcl::PointXYZI>::Ptr keypoints(new pcl::PointCloud<pcl::PointXYZI>());<br /> detector.compute(*keypoints);<br /><br /> std::cout << "keypoints detected: " << keypoints->size() << std::endl;<br /><br /> pcl::PointCloud<pcl::PointXYZ>::Ptr keypoints3D(new pcl::PointCloud<pcl::PointXYZ>());<br /> pcl::PointXYZ tmp;<br /> double max = 0,min=0;<br /><br /> for(pcl::PointCloud<pcl::PointXYZI>::iterator i = keypoints->begin(); i!= keypoints->end(); i++){<br /> tmp = pcl::PointXYZ((*i).x,(*i).y,(*i).z);<br /> if ((*i).intensity>max ){<br /> std::cout << (*i) << " coords: " << (*i).x << ";" << (*i).y << ";" << (*i).z << std::endl;<br /> max = (*i).intensity;<br /> }<br /> if ((*i).intensity<min){<br /> min = (*i).intensity;<br /> }<br /> keypoints3D->push_back(tmp);<br /> }<br /><br /> std::cout << "maximal responce: "<< max << " min responce: "<< min<<std::endl;<br /><br /> //show point cloud<br /> pcl::visualization::PCLVisualizer viewer ("3D Viewer");<br /> pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> pccolor(cloud, 255, 255, 255);<br /> pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> kpcolor(keypoints3D, 255, 0, 0);<br /> viewer.addPointCloud(cloud,pccolor,"testimg.png");<br /> viewer.addPointCloud(keypoints3D,kpcolor,"keypoints.png");<br /> viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "keypoints.png");<br /> while (!viewer.wasStopped ())<br /> {<br /> viewer.spinOnce();<br /> pcl_sleep (0.01);<br /> } <br /> return (0); <br /><br />}<br /><br />
<br />
実行結果<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvJa9kruVGhS69y5ZrR1ho5mYdUW1WgC6WTqp4KqPGFiET95l4b8P1YqmCANLQtxMDKgxZemIU7Z5vrOS19rtloHPcPRtyIAypm1y-9aaHJWv7TbHcThDuTYqx0xJDrqm6PF-bsWJ743xi/s1600/voxel_after.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvJa9kruVGhS69y5ZrR1ho5mYdUW1WgC6WTqp4KqPGFiET95l4b8P1YqmCANLQtxMDKgxZemIU7Z5vrOS19rtloHPcPRtyIAypm1y-9aaHJWv7TbHcThDuTYqx0xJDrqm6PF-bsWJ743xi/s1600/voxel_after.png" height="258" width="320" /><br />入力点群</a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYu3RrJTGPc2CMQv2wBct-yiYPgpPAL-ghyhkRXGQXVMVu6TgACn_FDlPWhSyU0YDwOU5Z4bOZ1ACY2dr9vzdl2zyeP1QGkJcTlPQ5FZfF5Ienv2N4M9Mr_oCKc8W91YeeQd-83lyNrxpL/s1600/Harris.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYu3RrJTGPc2CMQv2wBct-yiYPgpPAL-ghyhkRXGQXVMVu6TgACn_FDlPWhSyU0YDwOU5Z4bOZ1ACY2dr9vzdl2zyeP1QGkJcTlPQ5FZfF5Ienv2N4M9Mr_oCKc8W91YeeQd-83lyNrxpL/s1600/Harris.png" height="259" width="320" /><br />出力された点群+特徴点</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
画像では少々わかりにくいが、いわゆる角のような場所に点が加わっているのがわかると思う。</div>
<div class="separator" style="clear: both; text-align: left;">
一ヶ月ほど更新を休む必要ができたため次回の更新は未定とする(もともと不定期な更新であるが) </div>
Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-5212488458911720572015-03-12T13:41:00.000+09:002015-03-12T13:41:25.959+09:00点群データからSIFT特徴量を抽出する 以前記事にしたのは3次元点群のために作られた特徴量VFH(Viewpoint Feature Histogram)だったが、今回はSIFT(<span class="st">Scale-Invariant Feature Transform</span>)特徴量の取得を行う。このSIFT特徴量の計算を行う機能もVFH同様PCLで実装されている。<br />
<br />
コード<br />
<br /><br />#include "stdafx.h"<br /><br />#include <iostream><br />#include <pcl/io/pcd_io.h><br />#include <pcl/point_types.h><br />#include <pcl/common/io.h><br />#include <pcl/keypoints/sift_keypoint.h><br />#include <pcl/features/normal_3d.h><br />#include <pcl/visualization/pcl_visualizer.h><br /><br />pcl::PointCloud<pcl::PointNormal>::Ptr Surface_normals(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />{<br /> pcl::NormalEstimation<pcl::PointXYZ, pcl::PointNormal> ne;<br /> ne.setInputCloud (cloud);//法線の計算を行いたい点群を指定する<br /><br /> pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());//KDTREEを作る<br /> ne.setSearchMethod (tree);//検索方法にKDTREEを指定する<br /><br /> pcl::PointCloud<pcl::PointNormal>::Ptr cloud_normals (new pcl::PointCloud<pcl::PointNormal>);//法線情報を入れる変数<br /><br /> ne.setRadiusSearch (0.5);//検索する半径を指定する<br /><br /> ne.compute (*cloud_normals);//法線情報の出力先を指定する<br /><br /> return cloud_normals;<br />}<br /><br /><br />pcl::PointCloud<pcl::PointWithScale> Extract_SIFT(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::PointNormal>::Ptr cloud_normals)<br />{ <br /> // SIFT特徴量計算のためのパラメータ<br /> const float min_scale = 0.01f;<br /> const int n_octaves = 3;<br /> const int n_scales_per_octave = 4;<br /> const float min_contrast = 0.001f;<br /> pcl::SIFTKeypoint<pcl::PointNormal, pcl::PointWithScale> sift;<br /> pcl::PointCloud<pcl::PointWithScale> result;<br /> pcl::search::KdTree<pcl::PointNormal>::Ptr tree(new pcl::search::KdTree<pcl::PointNormal> ());<br /> sift.setSearchMethod(tree);<br /> sift.setScales(min_scale, n_octaves, n_scales_per_octave);<br /> sift.setMinimumContrast(0.00);<br /> sift.setInputCloud(cloud_normals);<br /> sift.compute(result);<br /> std::cout << "No of SIFT points in the result are " << result.points.size () << std::endl;<br /><br /> return result;<br />}<br /><br /><br />int _tmain(int argc, _TCHAR* argv[])<br /><br />{<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br /> pcl::io::loadPCDFile<pcl::PointXYZ> (argv[1], *cloud);<br /><br /> pcl::PointCloud<pcl::PointNormal>::Ptr cloud_normals (new pcl::PointCloud<pcl::PointNormal>);<br /> cloud_normals = Surface_normals(cloud);<br /><br /> // XYZの情報をcloudからSurface_normals(cloud)にXYZとして加える<br /> for(size_t i = 0; i < cloud_normals->points.size(); ++i)<br /> {<br /> cloud_normals->points[i].x = cloud->points[i].x;<br /> cloud_normals->points[i].y = cloud->points[i].y;<br /> cloud_normals->points[i].z = cloud->points[i].z;<br /> }<br /><br /> // 視覚化のためSIFT計算の結果をcloud_tempにコピー<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_temp (new pcl::PointCloud<pcl::PointXYZ>);<br /> copyPointCloud(Extract_SIFT(cloud, cloud_normals), *cloud_temp);<br /> std::cout << "SIFT points in the cloud_temp are " << cloud_temp->points.size () << std::endl;<br /> <br /> // 入力点群と計算された特徴点を表示<br /> pcl::visualization::PCLVisualizer viewer("PCL Viewer");<br /> pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> keypoints_color_handler (cloud_temp, 0, 255, 0);<br /> pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler (cloud, 255, 0, 0);<br /> viewer.setBackgroundColor( 0.0, 0.0, 0.0 );<br /> viewer.addPointCloud(cloud, cloud_color_handler, "cloud");<br /> viewer.addPointCloud(cloud_temp, keypoints_color_handler, "keypoints");<br /> viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "keypoints");<br /> while(!viewer.wasStopped ())<br /> {<br /> viewer.spinOnce ();<br /> }<br /> return (0); <br />}<br /><br />
<br />
<div style="text-align: center;">
<u><b>実行結果</b></u></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2sBPeZxswd2d1O4p7y5k288Zuu-iXbTx5BIxCkTiD8cZTr3pSCqFg9PH6l9H3HGR_FOag6XvkJg03ssG9LICK8JAFEVHvFMvz6dtS5-uzPm5Jpcc5trHqInjDEzLmHZJW8dzCHx2ljpxP/s1600/sift.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2sBPeZxswd2d1O4p7y5k288Zuu-iXbTx5BIxCkTiD8cZTr3pSCqFg9PH6l9H3HGR_FOag6XvkJg03ssG9LICK8JAFEVHvFMvz6dtS5-uzPm5Jpcc5trHqInjDEzLmHZJW8dzCHx2ljpxP/s1600/sift.png" height="258" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
赤の点が入力した点群、緑の点がSIFT特徴量として計算された点である。本来ならば色の情報も使うべきであるが現在色情報のついたデータがないため後日実行することにする。</div>
Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-56754427038399371922015-03-11T12:18:00.002+09:002015-03-11T12:18:59.620+09:00入力された点群の各座標の最大値と最小値を求める 題意の通り、極めて簡単なものなので必要がないと言われればその通りかもしれないが、なにかの機会に使用することがあるかもしれない。<br />
<br />
<div style="text-align: center;">
<u><b>コード</b></u></div>
<br />#include "stdafx.h"<br /><br />#include <iostream><br />#include <pcl/io/io.h><br />#include <pcl/io/pcd_io.h><br />#include <pcl/point_types.h><br />#include <stdlib.h><br /><br />class Size<br />{<br />public:<br /> double min_x;<br /> double min_y;<br /> double min_z;<br /> double max_x;<br /> double max_y;<br /> double max_z;<br />};<br /><br />Size Min_Max(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />{<br /> Size size;<br /> size.max_x = 0;<br /> size.max_y = 0;<br /> size.max_z = 0;<br /> size.min_x = 0;<br /> size.min_y = 0;<br /> size.min_z = 0;<br /><br /> for(size_t i = 0; i < cloud->points.size(); i++){<br /> if(size.max_z > cloud->points[i].z)<br /> size.max_z = size.max_z;<br /> else<br /> size.max_z = cloud->points[i].z;<br /><br /> if(size.max_y > cloud->points[i].y)<br /> size.max_y = size.max_y;<br /> else<br /> size.max_y = cloud->points[i].y;<br /><br /> if(size.max_x > cloud->points[i].x)<br /> size.max_x = size.max_x;<br /> else<br /> size.max_x = cloud->points[i].x;<br /><br /> if(size.min_z < cloud->points[i].z)<br /> size.min_z = size.min_z;<br /> else<br /> size.min_z = cloud->points[i].z;<br /><br /> if(size.min_y < cloud->points[i].y)<br /> size.min_y = size.min_y;<br /> else<br /> size.min_y = cloud->points[i].y;<br /><br /> if(size.min_x < cloud->points[i].x)<br /> size.min_x = size.min_x;<br /> else<br /> size.min_x = cloud->points[i].x;<br /> }<br /> return size;<br />}<br /><br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);<br /> pcl::io::loadPCDFile(argv[1], *cloud);<br /><br /> std::cout << Min_Max(cloud).max_x << std::endl;<br /> std::cout << Min_Max(cloud).max_y << std::endl;<br /> std::cout << Min_Max(cloud).max_z << std::endl;<br /> std::cout << Min_Max(cloud).min_x << std::endl;<br /> std::cout << Min_Max(cloud).min_y << std::endl;<br /> std::cout << Min_Max(cloud).min_z << std::endl;<br /><br /> return (0); <br /><br />}<br />Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-217239109169317202015-03-07T11:48:00.002+09:002015-03-07T11:48:16.618+09:00平面の検出 センサーから取得される点群データには、特に設定をしなければ壁などの構造物のデータも当然含まれる。こういったデータは目的によっては使われることがないので除去されるのが望ましい場合があったり、むしろ壁情報の方が重要である場合も当然あるので、いずれにせよ検知する必要がある。<br />
<br />
コード<br />
#include "stdafx.h"<br />
<br />
#include <iostream><br />
#include <pcl/ModelCoefficients.h><br />
#include <pcl/io/pcd_io.h><br />
#include <pcl/point_types.h><br />
#include <pcl/sample_consensus/method_types.h><br />
#include <pcl/sample_consensus/model_types.h><br />
#include <pcl/segmentation/sac_segmentation.h><br />
#include <pcl/filters/extract_indices.h><br />
<br />
<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr Detect_wall(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, bool TF)<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_output (new pcl::PointCloud<pcl::PointXYZ>);<br />
<br />
pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);<br />
pcl::PointIndices::Ptr inliers (new pcl::PointIndices);<br />
<br />
pcl::SACSegmentation<pcl::PointXYZ> seg;<br />
<br />
seg.setOptimizeCoefficients (true);<br />
// Mandatory<br />
seg.setModelType (pcl::SACMODEL_PLANE);//検出するモデルのタイプを指定<br />
seg.setMethodType (pcl::SAC_RANSAC);//検出に使用する方法を指定<br />
seg.setDistanceThreshold (0.01);//<br />
<br />
seg.setInputCloud (cloud);<br />
seg.segment (*inliers, *coefficients);<br />
<br />
pcl::ExtractIndices<pcl::PointXYZ> extract;<br />
extract.setInputCloud(cloud);<br />
extract.setIndices(inliers);<br />
extract.setNegative(TF);//Trueの場合出力は検出された壁以外のデータ falseの場合は壁のデータ<br />
extract.filter(*cloud_output);<br />
<br />
return cloud_output;//出力<br />
}<br />
<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); <br />
pcl::io::loadPCDFile(argv[1], *cloud);<br />
<br />
std::stringstream Filename;<br />
std::string name = argv[1];<br />
name.erase(name.length() - 4);<br />
Filename << name << "_wall.pcd";<br />
pcl::io::savePCDFileBinary(Filename.str(), *Detect_wall(cloud, false));<br />
<br />
Filename.str("");<br />
Filename << name << "_remaining.pcd";<br />
pcl::io::savePCDFileBinary(Filename.str(), *Detect_wall(cloud, true));<br />
<br />
return (0);<br />
}<br />
<br />
<br />
実行結果<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqOYZxmOPbmvPgSLZK18ooR3xSuF95YTxfv9Go1Ur0HumvgSjTwMbOdIWMjbB_q5c_BaPFAbY_Qo8YSLzBbW-VNLvyi37yq4vdVkWxmOtHldPjJxpCGvdSx9TolbHbIiNptIlpOAzMGot4/s1600/human_hide.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqOYZxmOPbmvPgSLZK18ooR3xSuF95YTxfv9Go1Ur0HumvgSjTwMbOdIWMjbB_q5c_BaPFAbY_Qo8YSLzBbW-VNLvyi37yq4vdVkWxmOtHldPjJxpCGvdSx9TolbHbIiNptIlpOAzMGot4/s1600/human_hide.png" height="258" width="320" /><br />入力データ</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4gPoeyCi-1LjGOL6q7KoENfq0WOs5isErzzLTPK6NWubD2iDaxDvFDz5Rr9efGAlA-S_uvwEfOehDRuB2qha2b1Qm0Q7oYNMgjSIxLWW-LTznxbEMKLEk4CiM6okimV10SUObc585VQPR/s1600/remaining.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4gPoeyCi-1LjGOL6q7KoENfq0WOs5isErzzLTPK6NWubD2iDaxDvFDz5Rr9efGAlA-S_uvwEfOehDRuB2qha2b1Qm0Q7oYNMgjSIxLWW-LTznxbEMKLEk4CiM6okimV10SUObc585VQPR/s1600/remaining.png" height="258" width="320" /><br />出力データ</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
無人空間などでSLAMを行う際にはこの平面の検出が重要になってくることがある。今回は壁の検出に関連する機能以外は使用していないが、処理の高速化、軽量化のためにダウンサンプリングやスムージングを行うのも良いかもしれない。実行結果のみからではOctreeを使用したものと変化が無いように感じられるが、このプログラムの場合入力するファイルはひとつで良い。Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-74582912826611890082015-03-06T13:47:00.002+09:002015-03-06T13:47:48.577+09:00点群データからメッシュモデルを生成する 点群データはあくまでも点の集まりにすぎないので、今回は点のそれぞれを結びメッシュデータを作成する。<br />
<br />
<br />
コード<br />
#include "stdafx.h"<br />
<br />
#include <pcl/point_types.h><br />
#include <pcl/io/pcd_io.h><br />
#include <pcl/kdtree/kdtree_flann.h><br />
#include <pcl/features/normal_3d.h><br />
#include <pcl/surface/gp3.h><br />
#include <pcl/io/vtk_io.h><br />
<br />
pcl::PointCloud<pcl::Normal>::Ptr surface_normals(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />
{<br />
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;<br />
ne.setInputCloud (cloud);//法線の計算を行いたい点群を指定する<br />
<br />
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());//KDTREEを作る<br />
ne.setSearchMethod (tree);//検索方法にKDTREEを指定する<br />
<br />
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);//法線情報を入れる変数<br />
<br />
ne.setRadiusSearch (0.005);//検索する半径を指定する<br />
<br />
ne.compute (*cloud_normals);//法線情報の出力先を指定する<br />
<br />
return cloud_normals;<br />
}<br />
<br />
pcl::PolygonMesh Generate_mesh(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />
{<br />
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal> ());<br />
cloud_normals = surface_normals(cloud);<br />
<br />
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals (new pcl::PointCloud<pcl::PointNormal>);<br />
pcl::concatenateFields (*cloud, *cloud_normals, *cloud_with_normals);<br />
<br />
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2 (new pcl::search::KdTree<pcl::PointNormal>);<br />
tree2->setInputCloud (cloud_with_normals);<br />
<br />
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;<br />
pcl::PolygonMesh triangles;<br />
<br />
gp3.setSearchRadius (0.025);<br />
<br />
gp3.setMu (2.5);<br />
gp3.setMaximumNearestNeighbors (100);<br />
gp3.setMaximumSurfaceAngle(M_PI/4); <br />
gp3.setMinimumAngle(M_PI/18);<br />
gp3.setMaximumAngle(2*M_PI/3);<br />
gp3.setNormalConsistency(false);<br />
<br />
gp3.setInputCloud (cloud_with_normals);<br />
gp3.setSearchMethod (tree2);<br />
gp3.reconstruct (triangles);<br />
<br />
std::vector<int> parts = gp3.getPartIDs();<br />
std::vector<int> states = gp3.getPointStates();<br />
<br />
return triangles;<br />
}<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br />
pcl::io::loadPCDFile (argv[1], *cloud);<br />
<br />
std::stringstream Filename;<br />
string name = argv[1];<br />
name.erase(name.length() - 4);<br />
Filename << name << "_mesh.vtk";<br />
pcl::io::saveVTKFile(Filename.str(), Generate_mesh(cloud));<br />
<br />
return (0);<br />
}<br />
<br />
<br />
実行結果<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEXDaEoRZAYyPgCsNPVB5t8nMk2So-GQGod8EmeBkZtz58cB-Jz0QklxlHBgtjRaYeAEYFEa10uwZuhUvdWPMgL0cp-lZvHbI5GX3tdHQdJC4mLfbXjRyzW_2arqGkXO4akBp3Ob1UHOFC/s1600/voxel_before.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEXDaEoRZAYyPgCsNPVB5t8nMk2So-GQGod8EmeBkZtz58cB-Jz0QklxlHBgtjRaYeAEYFEa10uwZuhUvdWPMgL0cp-lZvHbI5GX3tdHQdJC4mLfbXjRyzW_2arqGkXO4akBp3Ob1UHOFC/s1600/voxel_before.png" height="258" width="320" /><br />入力モデル</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcrRimlC4rus9sJKT-Gv-hrrdjQYoYdCRcDstz9_G8BJjLTkG67qNyhTXBoQjWAon8qcnWGTF9qniuHFws0lqzjmlNuEggMeQQSrZjq_j8uVpfysc2IjdoOcVuAbMY1fcZbR7GJcnGhkfQ/s1600/mesh.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcrRimlC4rus9sJKT-Gv-hrrdjQYoYdCRcDstz9_G8BJjLTkG67qNyhTXBoQjWAon8qcnWGTF9qniuHFws0lqzjmlNuEggMeQQSrZjq_j8uVpfysc2IjdoOcVuAbMY1fcZbR7GJcnGhkfQ/s1600/mesh.png" height="244" width="320" /><br />出力されたメッシュモデル</a></div>
<br />
<br />
<br />
メッシュデータ(VTK)の表示には<a href="http://www.paraview.org/" target="_blank">ParaView</a>(リンク)というソフトを使用した。<br />
当然このメッシュモデルは、点群の密度と数が多いほど精巧なモデルが得られる。 処理の内容については後に追記する。<br />
<br />Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-7477731465289966942015-03-05T16:16:00.002+09:002015-03-11T11:45:17.487+09:00PCD Viewerに機能追加 <a href="http://virtuemarket-lab.blogspot.jp/2015/02/blog-post_23.html" target="_blank">以前記事に載せたPCDファイルを表示するプログラム</a>はまさにPCDをファイルしか読み込めないので今回はこのプログラムを改良してVFHファイルも読み込んで表示できるようにする。自分が出力ファイルはひと目で分かるように「元となったファイル+”_***.pcd”」などの形式となっているのでファイル名によって判断を行う。<br />
<br />
<div style="text-align: center;">
<u><b>コード</b></u></div>
<br />#include "stdafx.h"<br /><br />#include <pcl/visualization/cloud_viewer.h><br />#include <iostream><br />#include <pcl/io/io.h><br />#include <pcl/io/pcd_io.h><br />#include <pcl/point_types.h><br />#include <stdlib.h><br />#include <pcl/visualization/histogram_visualizer.h><br /><br />void <br /> viewerOneOff (pcl::visualization::PCLVisualizer& viewer)<br />{ <br /> viewer.setBackgroundColor (1.0, 0.5, 1.0);<br />}<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> pcl::PointCloud<pcl::PointXYZRGBA> cloud;<br /><br /> std::string fname = argv[1];<br /> unsigned int loc = fname.find("_vfh",0);<br /> if(loc == std::string::npos)<br /> {<br /> pcl::visualization::CloudViewer viewer("Cloud Viewer");<br /> pcl::io::loadPCDFile (argv[1], cloud);<br /> viewer.runOnVisualizationThreadOnce (viewerOneOff);<br /> viewer.showCloud(cloud.makeShared());<br /> while (!viewer.wasStopped ())<br /> {<br /> }<br /> }<br /> else{<br /> pcl::PointCloud<pcl::VFHSignature308>::Ptr vfhs (new pcl::PointCloud<pcl::VFHSignature308> ());<br /> pcl::io::loadPCDFile(argv[1], *vfhs);<br /> pcl::visualization::PCLHistogramVisualizer hist;<br /> hist.addFeatureHistogram(*vfhs,263,"id",640,200);<br /> std::cout << vfhs->points[0].histogram[308];<br /><br /> while (1)<br /> {<br /> hist.spinOnce (100);<br /> }<br /> }<br /> return (0); <br />}<br />
<br />
おそらくファイル内にある「FIELD」の項目によって機能の切り替えを行うべきなのかもしれないが今回はそれを行っていない。 Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-55618242768408020912015-03-05T14:29:00.003+09:002015-03-05T14:29:50.093+09:00PLYデータを点群データ(PCD)に変換する 現在3次元のデータには複数のファイルフォーマットが存在するが、それらの多くは点群データに変換可能である。今回は有名なPLYファイルを点群データファイルPCDに変換する。<br />
短すぎるので関数化はしていない。 <br />
<br />
コード <br />
<br />
#include "stdafx.h"<br /><br />#include <iostream><br />#include <pcl/io/pcd_io.h><br />#include <pcl/io/ply_io.h><br />#include <pcl/point_types.h><br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br /><br /> pcl::PLYReader reader;<br /> reader.read<pcl::PointXYZ> (argv[1], *cloud);<br /><br /> std::stringstream Filename;<br /> std::string name = argv[1];<br /> name.erase(name.length() - 4);<br /> Filename << name << ".pcd";<br /> std::cout << Filename.str() << std::endl;<br /> pcl::io::savePCDFileBinary(Filename.str(), *cloud);<br /><br /> return (0);<br />}<br />
PLYファイルを表示するプログラムを誤って消してしまったので今回は実行結果を掲載していないが、このプログラムを使用することによって出力される点群データは表示できているので成功していることにする。 前述したが、極めて短いコードなのでプログラムと呼べるのかは疑問である。Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-39982130931120016722015-03-05T14:15:00.001+09:002015-03-05T14:15:10.129+09:00点群データのスムージング センサから得られる点群データは、実空間上では平面であってもいざ点群データとして出力された場合は、微妙の誤差があり、まるで凹凸があるかのようになってしまう。勿論これはセンサの原理的に起こりうる事象なので仕方がない。PCLではこの微妙な誤差を修正するためにスムージングを行う機能がある。<br />
<br />
<br />
<div style="text-align: center;">
<b><u>コード</u></b></div>
<br />#include "stdafx.h"<br /><br />#include <pcl/point_types.h><br />#include <pcl/io/pcd_io.h><br />#include <pcl/kdtree/kdtree_flann.h><br />#include <pcl/surface/mls.h><br /><br />pcl::PointCloud<pcl::PointNormal> Smoothing(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />{<br /> pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);//Kdtreeの作成<br /><br /> pcl::PointCloud<pcl::PointNormal> mls_points;//出力する点群の格納場所を作成<br /><br /> pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;<br /><br /> mls.setComputeNormals (true);//法線の計算を行うかどうか<br /><br /> // 各パラメーターの設定<br /> mls.setInputCloud (cloud);<br /> mls.setPolynomialFit (true);<br /> mls.setSearchMethod (tree);<br /> mls.setSearchRadius (0.03);<br /><br /> mls.process (mls_points);//再構築<br /><br /> return mls_points;//出力<br />}<br /><br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());<br /> pcl::io::loadPCDFile (argv[1], *cloud);<br /><br /> std::stringstream Filename;<br /> string name = argv[1];<br /> name.erase(name.length() - 4);<br /> Filename << name << "_smoothed.pcd";<br /> std::cout << Filename.str() << std::endl;<br /> pcl::io::savePCDFile (Filename.str(), Smoothing(cloud));<br /> return (0);<br />}<br />
<br />
<div style="text-align: center;">
<u><b>実行結果</b></u></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-t8E5ytY1cdTDZxs-xb7itpZcAKTSu6NwcCgKN1uWoInRnfoF1Kle2FG0bpW6zKB2VpoZwnuu4phYbso5JSmoMNLS-XTgHFM914Y1lfxLWknAhE6ct-6DsvgMLQb7AeXlqcy-kvHkKVNs/s1600/orig.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-t8E5ytY1cdTDZxs-xb7itpZcAKTSu6NwcCgKN1uWoInRnfoF1Kle2FG0bpW6zKB2VpoZwnuu4phYbso5JSmoMNLS-XTgHFM914Y1lfxLWknAhE6ct-6DsvgMLQb7AeXlqcy-kvHkKVNs/s1600/orig.png" height="258" width="320" /><b><br /></b>処理前</a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSYD2Xo2To3FmdYQZe3f9bbY8wCLDLftfYOv__LMqFKN_GlKNQSEX6TY8V7gzjZuiDE6YvPUq3mAiAymm6XOfttBi41-jdQo979OlcNu1BaldzHoOUbSieXZLezrrHdzyyFFW8w9t9y7nT/s1600/smooth.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSYD2Xo2To3FmdYQZe3f9bbY8wCLDLftfYOv__LMqFKN_GlKNQSEX6TY8V7gzjZuiDE6YvPUq3mAiAymm6XOfttBi41-jdQo979OlcNu1BaldzHoOUbSieXZLezrrHdzyyFFW8w9t9y7nT/s1600/smooth.png" height="258" width="320" /><br />処理後</a></div>
<br />
<br />
このスムージング処理を行った後の点群データを使用すると平面の検出をより精度よく行うことができるが構造が複雑なものに対して行うと、その物体の構造を崩してしまうので必要に応じて点群を切り分けるなどの処理が必要である。Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-54309230926548112912015-03-04T13:48:00.001+09:002015-03-04T13:48:44.164+09:00点群データの特徴を抽出する Viewpoint Feature Histogram 物体検出などを行う際にはかならずと言っていいほどデータから特徴を抽出する。2次元においてはそういった特徴は無数に存在するが、比較的最近研究が行われるようになった3次元の点群においてはまだ数えるほどしかない。(2次元で使用される特徴量を3次元点群からも抽出できるようにしたものもある)PCLではいくつか点群から抽出する特徴量があり、その一つがViewpoint Feature Histogramである。PCLが提供している機能には他にもPFH(Point Feature Histogram)やFPFH(Fast Point Feature Histogram)などもある。それらについてはまた記事にする。<br />
<br />
<br />
<div style="text-align: center;">
<b><u>コード</u></b></div>
#include "stdafx.h"<br /><br />#include <pcl/point_types.h><br />#include <pcl/features/vfh.h><br />#include <pcl/io/pcd_io.h><br />#include <pcl/features/normal_3d.h><br /><br />pcl::PointCloud<pcl::Normal>::Ptr surface_normals(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />{<br /> pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;<br /> ne.setInputCloud (cloud);//法線の計算を行いたい点群を指定する<br /><br /> pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());//KDTREEを作る<br /> ne.setSearchMethod (tree);//検索方法にKDTREEを指定する<br /><br /> pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);//法線情報を入れる変数<br /><br /> ne.setRadiusSearch (0.005);//検索する半径を指定する<br /><br /> ne.compute (*cloud_normals);//法線情報の出力先を指定する<br /><br /> return cloud_normals;<br />}<br /><br /><br />pcl::PointCloud<pcl::VFHSignature308>::Ptr Extract_VFH(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />{<br /> pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal> ());<br /> pcl::VFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::VFHSignature308> vfh;<br /> pcl::PointCloud<pcl::VFHSignature308>::Ptr vfhs (new pcl::PointCloud<pcl::VFHSignature308> ());<br /> <br /> cloud_normals = surface_normals(cloud);<br /> <br /> vfh.setInputCloud (cloud);<br /> vfh.setInputNormals (cloud_normals);<br /><br /> pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());<br /> vfh.setSearchMethod (tree);<br /><br /> <br /> vfh.compute (*vfhs);<br /> return vfhs;<br />}<br /><br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br /> pcl::io::loadPCDFile(argv[1], *cloud);<br /> <br /> std::stringstream Filename;<span id="goog_160046203"></span><span id="goog_160046204"></span><br /> string name = argv[1];<br /> name.erase(name.length() - 4);<br /> Filename << name << "_vfh.pcd";<br /> std::cout << Filename.str() << std::endl;<br /> pcl::io::savePCDFile(Filename.str(), *Extract_VFH(cloud));<br /><br /> return (0);<br />}<br />
<br />
<br />
<div style="text-align: center;">
<b><u>実行結果</u></b></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTLdMqvvi2H05seG4lsIIYKsodRKqnjZJGgQwJUlCBWelny0PnLBGnsS33nMLn8XZuwaUdK2BGjjWbwWEtsKitrv15B66Uzfen7TXMBtEK4njpm4sn_NFCYrNbDFZeyjHmXq2AynJPfeKy/s1600/voxel_after.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTLdMqvvi2H05seG4lsIIYKsodRKqnjZJGgQwJUlCBWelny0PnLBGnsS33nMLn8XZuwaUdK2BGjjWbwWEtsKitrv15B66Uzfen7TXMBtEK4njpm4sn_NFCYrNbDFZeyjHmXq2AynJPfeKy/s1600/voxel_after.png" height="258" width="320" /><br />ダウンサンプリングを行っていない兎モデル</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJSOb5H9pYW2CqGQLxL_I7MGzB6VPq0HI0eW6SREESOFWJsNsnpB5DYQBSXcw-ZOzZut3IWtbWyVmwvVCSN6LfIR9PrBHCZccRCSj80y5SpJu3TqBgUuIcDG5KkJ1bSu17PrMwbF72UTPZ/s1600/vfh1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJSOb5H9pYW2CqGQLxL_I7MGzB6VPq0HI0eW6SREESOFWJsNsnpB5DYQBSXcw-ZOzZut3IWtbWyVmwvVCSN6LfIR9PrBHCZccRCSj80y5SpJu3TqBgUuIcDG5KkJ1bSu17PrMwbF72UTPZ/s1600/vfh1.png" height="116" width="320" /><br />抽出されたVFH</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvJa9kruVGhS69y5ZrR1ho5mYdUW1WgC6WTqp4KqPGFiET95l4b8P1YqmCANLQtxMDKgxZemIU7Z5vrOS19rtloHPcPRtyIAypm1y-9aaHJWv7TbHcThDuTYqx0xJDrqm6PF-bsWJ743xi/s1600/voxel_after.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvJa9kruVGhS69y5ZrR1ho5mYdUW1WgC6WTqp4KqPGFiET95l4b8P1YqmCANLQtxMDKgxZemIU7Z5vrOS19rtloHPcPRtyIAypm1y-9aaHJWv7TbHcThDuTYqx0xJDrqm6PF-bsWJ743xi/s1600/voxel_after.png" height="258" width="320" /><br />ダウンサンプリングを行った兎モデル</a></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB8jqpXHua3UlrbCqCHA_ZG7UDEjSu3KqhI56AtTydXdwneManMvZLeE_cI4fR7XdTVEI8wu7HicRuAmHPTEXZi0aDvP6Cw7-Z8Duxpu3v7Xn-WlkUFZzEDAsKWcDheeeI-5WpSaGgnKwN/s1600/vfh2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB8jqpXHua3UlrbCqCHA_ZG7UDEjSu3KqhI56AtTydXdwneManMvZLeE_cI4fR7XdTVEI8wu7HicRuAmHPTEXZi0aDvP6Cw7-Z8Duxpu3v7Xn-WlkUFZzEDAsKWcDheeeI-5WpSaGgnKwN/s1600/vfh2.png" height="116" width="320" /><br />抽出されたVFH<br /></a></div>
ダウンサンプリングによって点群の数を約3分の1程度まで減少させた2つのモデルからVFHを抽出しても得られるヒストグラムはまったく一緒である。Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com1tag:blogger.com,1999:blog-2881629368794017135.post-8397544974386793352015-03-03T11:59:00.001+09:002015-03-03T11:59:22.776+09:00点群のクラスタリング Kinectから得られる点群データは基本的に背景や、空間内に存在する物体情報が一つのファイルの中に含まれている。物体認識などを点群データを用いて行う場合は、ラスタースキャンなどによって3次元空間中をマッチングしていくことも勿論可能であるが、2次元での探索以上に時間がかかってしまう。そこで入力点群にクラスタリングを行い1つのデータを複数のデータに分割してそれぞれを比較するとにより高速に行う方法がある。<br />
<br />
処理の流れ<br />
<ol>
<li>入力点群PのKd-treeを作る</li>
<li>空のクラスタを作り、検査が必要な点Qを設定する</li>
<li>Pに属する全ての点piに対して以下の処理を行う。</li>
<ol>
<li> piををQに加える</li>
<li>Qに属する全ての点piに対して以下の処理を行う</li>
<ol>
<li>設定半径内に存在するpiの近隣の点pnを捜査する</li>
<li>発見された全ての点pnがすでに処理を行われていなければQに加える</li>
</ol>
<li> Qに保存された全ての点への処理が終了した場合QをCに登録し、Qの点群を空にする</li>
</ol>
<li>全てのPに属する点pへの処理が完了したら終了とする。Cに登録された各QがPから得られたクラスタである。</li>
</ol>
<br />
<div style="text-align: center;">
<b><u>コード</u></b></div>
<br />#include "stdafx.h"<br /><br />#include <pcl/ModelCoefficients.h><br />#include <pcl/point_types.h><br />#include <pcl/io/pcd_io.h><br />#include <pcl/filters/extract_indices.h><br />#include <pcl/filters/voxel_grid.h><br />#include <pcl/features/normal_3d.h><br />#include <pcl/kdtree/kdtree.h><br />#include <pcl/sample_consensus/method_types.h><br />#include <pcl/sample_consensus/model_types.h><br />#include <pcl/segmentation/sac_segmentation.h><br />#include <pcl/segmentation/extract_clusters.h><br />#include <direct.h><br /><br />class Size<br />{<br />public:<br /> double length;///x方向<br /> double width;///y方向<br /> double height;///z方向<br />};<br /><br />Size max_min(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)//点群の各XYZ方向の最大値と最小値を求める<br />{<br /> double min_x, min_y, min_z, max_x, max_y, max_z;<br /> Size size;<br /> min_x = 10000;<br /> min_y = 10000;<br /> min_z = 100000;<br /> max_x = -10000;<br /> max_y = -10000;<br /> max_z = -10000;<br /><br /> for(int i = 0; i < cloud->points.size(); i++)<br /> {<br /> if(max_x < cloud->points[i].x)<br /> max_x = cloud->points[i].x;<br /> if(max_y < cloud->points[i].y)<br /> max_y = cloud->points[i].y;<br /> if(max_z < cloud->points[i].z)<br /> max_z = cloud->points[i].z;<br /><br /> if(min_x > cloud->points[i].x)<br /> min_x = cloud->points[i].x;<br /> if(min_y > cloud->points[i].y)<br /> min_y = cloud->points[i].y;<br /> if(min_z > cloud->points[i].z)<br /> min_z = cloud->points[i].z;<br /> }<br /><br /> size.length = abs(max_x) + abs(min_x);<br /> size.width = abs(max_y) + abs(min_y);<br /> size.height = abs(max_z) + abs(min_y);<br /> return size;<br />}<br /><br />void Clustering(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />{ <br /> Size size;<br /> size = max_min(cloud);<br /> double min = size.height;<br /> if(min > size.width)<br /> min = size.width;<br /> if(min > size.length)<br /> min = size.length;<br /> if(min > size.height)<br /> min = size.height;<br /><br /> pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);<br /> tree->setInputCloud (cloud);<br /><br /> std::vector<pcl::PointIndices> cluster_indices;<br /> pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;<br /> ec.setClusterTolerance (min / 10);<br /> ec.setMinClusterSize (10);//最小のクラスターの値を設定<br /> ec.setMaxClusterSize (25000);//最大のクラスターの値を設定<br /> ec.setSearchMethod (tree);//検索に使用する手法を指定<br /> ec.setInputCloud (cloud);//点群を入力<br /> ec.extract (cluster_indices);//クラスター情報を出力<br /><br /> std::string name;<br /> name = "cluster";<br /><br /> int j = 0;<br /> for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin (); it != cluster_indices.end (); ++it)//クラスターを1塊ごと出力<br /> {<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster (new pcl::PointCloud<pcl::PointXYZ>);<br /> for (std::vector<int>::const_iterator pit = it->indices.begin (); pit != it->indices.end (); pit++)<br /> cloud_cluster->points.push_back (cloud->points[*pit]); //*<br /><br /> cloud_cluster->width = cloud_cluster->points.size ();<br /> cloud_cluster->height = 1;<br /> cloud_cluster->is_dense = true;<br /><br /> std::cout << "PointCloud representing the Cluster: " << cloud_cluster->points.size () << " data points." << std::endl;<br /> std::stringstream ss;<br /> ss << name << "_p_" << j << ".pcd";//クラスター毎に名前を変化<br /> pcl::io::savePCDFileBinary(ss.str(), *cloud_cluster);<br /> j++;<br /> }<br />}<br /><br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br /> pcl::io::loadPCDFile(argv[1], *cloud);<br /><br /> Clustering(cloud);<br /><br /> return (0);<br /><br />}<br />
<br />
<br />
実行結果<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPwBREP9Rhs2FKL7iQWqexXRd0-vqwSEaBpTe_FRKG7wP5atV6t5QOwK6VQXvDJCrm8fCQxYfjtl2HW18VICCRmuQnlou8LNlSOB_xnktCMcZct0r0-crL-DLF-FJ0ne2g706DK9kuF7vM/s1600/original.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPwBREP9Rhs2FKL7iQWqexXRd0-vqwSEaBpTe_FRKG7wP5atV6t5QOwK6VQXvDJCrm8fCQxYfjtl2HW18VICCRmuQnlou8LNlSOB_xnktCMcZct0r0-crL-DLF-FJ0ne2g706DK9kuF7vM/s1600/original.png" height="258" width="320" /><br />入力点群</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf0ctSMk81lqK86QHEHBBl5WGX9o0X7TUyJZ_ybL3s-x1RgfWBX-KhSZ1Oji8X1hEcMIS-5RR6ovgGfPg2tUELdAqLwsLoIWBaHnUPF0TtPHO3du6uCUAgocnjapnZnN5Ja1ntUSWU2qU8/s1600/cluster1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf0ctSMk81lqK86QHEHBBl5WGX9o0X7TUyJZ_ybL3s-x1RgfWBX-KhSZ1Oji8X1hEcMIS-5RR6ovgGfPg2tUELdAqLwsLoIWBaHnUPF0TtPHO3du6uCUAgocnjapnZnN5Ja1ntUSWU2qU8/s1600/cluster1.png" height="258" width="320" /><br />出力されたクラスター1</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMlVWZJNZ8zoPliiNmoDiOsjyXgu9edm77hi-Roy_xeM3cln5ZDtieyzqg2TzJF4gz6Daf6dcAv40Ikh4lTMuCnXLtIIKX13-kr-2C3mqZnY5QzuLm4Wcaz5_HXwNJIS2pvf6g0fwNAmAR/s1600/cluster2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMlVWZJNZ8zoPliiNmoDiOsjyXgu9edm77hi-Roy_xeM3cln5ZDtieyzqg2TzJF4gz6Daf6dcAv40Ikh4lTMuCnXLtIIKX13-kr-2C3mqZnY5QzuLm4Wcaz5_HXwNJIS2pvf6g0fwNAmAR/s1600/cluster2.png" height="258" width="320" /><br />出力されたクラスター2</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw3FqCW5kM7evjq3YYPgNal4kUQpjpfCa05dudn6dxm1a1VLmOKCu5XkP5DHrJ7YbIyQrIzPxyfXL6v3WdCEm2I7iTuQfg4TZQrlOC3GZVQH69DPBIWKc7zTkLG5gGLjdOrLgejpJ6YNin/s1600/cluster3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw3FqCW5kM7evjq3YYPgNal4kUQpjpfCa05dudn6dxm1a1VLmOKCu5XkP5DHrJ7YbIyQrIzPxyfXL6v3WdCEm2I7iTuQfg4TZQrlOC3GZVQH69DPBIWKc7zTkLG5gGLjdOrLgejpJ6YNin/s1600/cluster3.png" height="258" width="320" /><br />出力されたクラスター3</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRrmDbwcjouGkAyIrRwJMHipFNdijq1Q792cHTvFMr8POs3hGqaWXPlfgm3_MZLwiIpFNSTX1oyCG0mJoZHgnj3NsO4avcjVUcsRqW1j0JVioo6Z_7gxTOzsR26wfVVaRMt5rPvdQLDiT-/s1600/cluster4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRrmDbwcjouGkAyIrRwJMHipFNdijq1Q792cHTvFMr8POs3hGqaWXPlfgm3_MZLwiIpFNSTX1oyCG0mJoZHgnj3NsO4avcjVUcsRqW1j0JVioo6Z_7gxTOzsR26wfVVaRMt5rPvdQLDiT-/s1600/cluster4.png" height="258" width="320" /><br />出力されたクラスター4</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXi3q24Ohpxd3B3afrnP7Xnza8a42A5kZxamGlCZ-ABNQr_T8dT7rCIsu81gd7X5gplcamlP5fbrD-4WC8nc5LpA9I8ECfc_WlKFtAt2z_CyGSweJ_frchaDHX1Uxm1Fj5q5GmEQmhjd2v/s1600/cluster5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXi3q24Ohpxd3B3afrnP7Xnza8a42A5kZxamGlCZ-ABNQr_T8dT7rCIsu81gd7X5gplcamlP5fbrD-4WC8nc5LpA9I8ECfc_WlKFtAt2z_CyGSweJ_frchaDHX1Uxm1Fj5q5GmEQmhjd2v/s1600/cluster5.png" height="258" width="320" /><br />出力されたクラスタ-5</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<br />
この方法の問題点はクラスタリングが正確にできていない場合が多分に発生することである。なので正確な設定が必要とされる。Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-21776379666496909332015-03-03T11:25:00.002+09:002015-03-03T11:25:21.974+09:00Outlier(外れ値、異常値)を除去するプログラム Kinectなどの3次元点群を取得するセンサーは便利であるが、度々ある点の座標値が以上であったりすることがある。こういった点のことをよくノイズだとかエラーだとか外れ値という。原理的にこれは発生しうる。またこれらを放置すると、法線の正確な計算など後に適用される処理に悪影響を与えるので除去しなければならない。<br />
除去の原理は簡単に言うと各点からその近隣の全ての点への平均距離を用いる。<br />
<br />
<div style="text-align: center;">
<u><b>コード</b></u> </div>
#include "stdafx.h"<br />#include <iostream><br />#include <pcl/io/pcd_io.h><br />#include <pcl/point_types.h><br />#include <pcl/filters/statistical_outlier_removal.h><br />#include <pcl/filters/radius_outlier_removal.h><br />#include <pcl/filters/conditional_removal.h><br /><br />pcl::PointCloud<pcl::PointXYZ> Remove_outliers(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />{<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);<br /> pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;<br /> sor.setInputCloud (cloud);//外れ値を除去する点群を入力<br /> sor.setMeanK (50);//MeanKを設定<br /> sor.setStddevMulThresh (0.1);<br /> sor.setNegative (false);//外れ値を出力する場合はtrueにする<br /> sor.filter (*cloud_filtered);//出力<br /> return *cloud_filtered;<br />}<br /><br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /><br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br /> <br /> pcl::io::loadPCDFile(argv[1], *cloud);<br /><br /> std::stringstream Filename;<br /> string name = argv[1];<br /> name.erase(name.length()-4);<br /> Filename << name << "_outlier.pcd";<br /> <br /> <br /> pcl::io::savePCDFileBinary (Filename.str(), Remove_outliers(cloud));<br /><br /> return (0);<br />}<br />
<br />
<br />
手頃なデータがなかったので実行結果は表示できていない。<u><i><b>sor.setNegative</b></i></u>を<u><b><i>true</i></b></u>に設定すれば除去される外れ値の点群を出力できる。もちろん2つ点群の格納場所を作れば2つ同時に出力できる。<br />
<br />Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-82503033472152686042015-02-26T17:37:00.000+09:002015-03-04T13:12:50.424+09:00座標軸を回転させる 点群データは、時に移動させたり回転させたりしなければならないことが多々ある。今回は座標軸を回転させるプログラムを作る。尚PCLでは赤の座標軸がX軸、緑がY軸、青がZ軸を表している<br />
<br />
<div style="text-align: center;">
<b><u>コード</u></b></div>
<br />
#include "stdafx.h"<br />
<br />
#include <iostream><br />
<br />
#include <boost/thread/thread.hpp><br />
#include <pcl/common/common_headers.h><br />
#include <pcl/features/normal_3d.h><br />
#include <pcl/io/pcd_io.h><br />
#include <stdlib.h><br />
<br />
<br />
void centroid(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />
{<br />
Eigen::Vector4f xyz_centroid;<br />
pcl::compute3DCentroid(*cloud, xyz_centroid);//重心を計算<br />
<br />
for(size_t i = 0; i < cloud->points.size(); i++){<br />
cloud->points[i].x = cloud->points[i].x - xyz_centroid[0];//X座標の移動<br />
cloud->points[i].y = cloud->points[i].y - xyz_centroid[1];//Y座標の移動<br />
cloud->points[i].z = cloud->points[i].z - xyz_centroid[2];//Z座標の移動<br />
}<br />
}<br />
<br />
pcl::PointCloud<pcl::PointXYZ> rotation_x(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, double theta)///rotate point cloud by Y axiz<br />
{<br />
<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_centroid (new pcl::PointCloud<pcl::PointXYZ>);<br />
cloud_centroid = cloud;<br />
<br />
centroid(cloud_centroid);//点群の重心位置求めを(0,0,0)に移動する<br />
<br />
Eigen::Matrix4f rot_x;<br />
pcl::PointCloud<pcl::PointXYZ> cloud_out;<br />
cloud_out = *cloud;<br />
double theta_x = theta * 3.1415926 / 180.0;//角度の変換<br />
rot_x(0,0) = 1.0;<br />
rot_x(1,0) = 0.0;<br />
rot_x(2,0) = 0.0;<br />
rot_x(3,0) = 0.0;<br />
rot_x(0,1) = 0.0;<br />
rot_x(1,1) = cos(theta_x);<br />
rot_x(2,1) = -sin(theta_x);<br />
rot_x(3,1) = 0.0;<br />
rot_x(0,2) = 0.0;<br />
rot_x(1,2) = sin(theta_x);<br />
rot_x(2,2) = cos(theta_x);<br />
rot_x(3,2) = 0.0;<br />
rot_x(0,3) = 0.0;<br />
rot_x(1,3) = 0.0;<br />
rot_x(2,3) = 0.0;<br />
rot_x(3,3) = 1.0;<br />
<br />
for(size_t i = 0; i < cloud->points.size(); ++i){<br />
cloud_out.points[i].x = rot_x(0,0) * cloud->points[i].x + rot_x(0,1) * cloud->points[i].y + rot_x(0,2) * cloud->points[i].z + rot_x(0,3) * 1;<br />
cloud_out.points[i].y = rot_x(1,0) * cloud->points[i].x + rot_x(1,1) * cloud->points[i].y + rot_x(1,2) * cloud->points[i].z + rot_x(1,3) * 1;<br />
cloud_out.points[i].z = rot_x(2,0) * cloud->points[i].x + rot_x(2,1) * cloud->points[i].y + rot_x(2,2) * cloud->points[i].z + rot_x(2,3) * 1;<br />
}<br />
<br />
return cloud_out;<br />
}<br />
<br />
pcl::PointCloud<pcl::PointXYZ> rotation_y(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, double theta)///rotate point cloud by Y axiz<br />
{<br />
<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_centroid (new pcl::PointCloud<pcl::PointXYZ>);<br />
cloud_centroid = cloud;<br />
<br />
centroid(cloud_centroid);//点群の重心位置求めを(0,0,0)に移動する<br />
<br />
Eigen::Matrix4f rot_y;<br />
pcl::PointCloud<pcl::PointXYZ> cloud_out;<br />
cloud_out = *cloud;<br />
double theta_y = theta * 3.1415926 / 180.0;//角度の変換<br />
rot_y(0,0) = cos(theta_y);<br />
rot_y(1,0) = 0.0;<br />
rot_y(2,0) = sin(theta_y);<br />
rot_y(3,0) = 0.0;<br />
rot_y(0,1) = 0.0;<br />
rot_y(1,1) = 1.0;<br />
rot_y(2,1) = 0.0;<br />
rot_y(3,1) = 0.0;<br />
rot_y(0,2) = -sin(theta_y);<br />
rot_y(1,2) = 0.0;<br />
rot_y(2,2) = cos(theta_y);<br />
rot_y(3,2) = 0.0;<br />
rot_y(0,3) = 0.0;<br />
rot_y(1,3) = 0.0;<br />
rot_y(2,3) = 0.0;<br />
rot_y(3,3) = 1.0;<br />
<br />
for(size_t i = 0; i < cloud->points.size(); ++i){<br />
cloud_out.points[i].x = rot_y(0,0) * cloud->points[i].x + rot_y(0,1) * cloud->points[i].y + rot_y(0,2) * cloud->points[i].z + rot_y(0,3) * 1;<br />
cloud_out.points[i].y = rot_y(1,0) * cloud->points[i].x + rot_y(1,1) * cloud->points[i].y + rot_y(1,2) * cloud->points[i].z + rot_y(1,3) * 1;<br />
cloud_out.points[i].z = rot_y(2,0) * cloud->points[i].x + rot_y(2,1) * cloud->points[i].y + rot_y(2,2) * cloud->points[i].z + rot_y(2,3) * 1;<br />
}<br />
<br />
return cloud_out;<br />
}<br />
<br />
<br />
pcl::PointCloud<pcl::PointXYZ> rotation_z(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, double theta)///rotate point cloud by Y axiz<br />
{<br />
<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_centroid (new pcl::PointCloud<pcl::PointXYZ>);<br />
cloud_centroid = cloud;<br />
<br />
centroid(cloud_centroid);//点群の重心位置求めを(0,0,0)に移動する<br />
<br />
Eigen::Matrix4f rot_z;<br />
pcl::PointCloud<pcl::PointXYZ> cloud_out;<br />
cloud_out = *cloud;<br />
double theta_z = theta * 3.1415926 / 180.0;//角度の変換<br />
rot_z(0,0) = cos(theta_z);<br />
rot_z(1,0) = -sin(theta_z);<br />
rot_z(2,0) = 0.0;<br />
rot_z(3,0) = 0.0;<br />
rot_z(0,1) = sin(theta_z);<br />
rot_z(1,1) = cos(theta_z);<br />
rot_z(2,1) = 0.0;<br />
rot_z(3,1) = 0.0;<br />
rot_z(0,2) = 0.0;<br />
rot_z(1,2) = 0.0;<br />
rot_z(2,2) = 1.0;<br />
rot_z(3,2) = 0.0;<br />
rot_z(0,3) = 0.0;<br />
rot_z(1,3) = 0.0;<br />
rot_z(2,3) = 0.0;<br />
rot_z(3,3) = 1.0;<br />
<br />
for(size_t i = 0; i < cloud->points.size(); ++i){<br />
cloud_out.points[i].x = rot_z(0,0) * cloud->points[i].x + rot_z(0,1) * cloud->points[i].y + rot_z(0,2) * cloud->points[i].z + rot_z(0,3) * 1;<br />
cloud_out.points[i].y = rot_z(1,0) * cloud->points[i].x + rot_z(1,1) * cloud->points[i].y + rot_z(1,2) * cloud->points[i].z + rot_z(1,3) * 1;<br />
cloud_out.points[i].z = rot_z(2,0) * cloud->points[i].x + rot_z(2,1) * cloud->points[i].y + rot_z(2,2) * cloud->points[i].z + rot_z(2,3) * 1;<br />
}<br />
<br />
return cloud_out;<br />
}<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr rotated_cloud (new pcl::PointCloud<pcl::PointXYZ>);<br />
<br />
pcl::io::loadPCDFile(argv[1],*cloud);<br />
<br />
Eigen::Vector4f xyz_centroid;<br />
pcl::compute3DCentroid(*cloud, xyz_centroid);//元の点群の重心位置を記録<br />
<br />
*rotated_cloud = rotation_x(cloud, -90.0);//回転<br />
//*rotated_cloud = rotation_y(cloud, -90.0);//回転<br />
//*rotated_cloud = rotation_z(cloud, -90.0);//回転<br />
<br />
std::stringstream Filename;<br />
string name = argv[1];<br />
name.erase(name.length()-4);<br />
Filename << name << "_rotated.pcd";<br />
<br />
pcl::io::savePCDFileBinary(Filename.str(), *rotated_cloud);<br />
return 0;<br />
}<br />
<br />
<br />
結果<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsjy8-LS0Ja6SZF_0NKZS_gn3n8oY3kSO63pjd0pw7PnPK8pm5gWMS7aXIHJwV5zCl15nqD6DKiGEyJk9yhM4Or8qFs1n9y2w1crDETRxLfmq7uiSM603xqB6z_v-MF8IhcEj8XCvx_cVI/s1600/bunny_orig.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsjy8-LS0Ja6SZF_0NKZS_gn3n8oY3kSO63pjd0pw7PnPK8pm5gWMS7aXIHJwV5zCl15nqD6DKiGEyJk9yhM4Or8qFs1n9y2w1crDETRxLfmq7uiSM603xqB6z_v-MF8IhcEj8XCvx_cVI/s1600/bunny_orig.png" height="258" width="320" /><br /><b>実行前</b></a><b> </b></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyRBte5jV1JCCp3FROc9Ro2K2Iti7499AGxWOvcHdL1gWI8jzO4IwXcqIgAZ-q-5xGTqnosNvR4-f-3byxGTiXqjFBC7EEOiCsHNxc1xjUhLbSEucPFURgABMyrecFSAi9XT7v1eGoEkQ9/s1600/bunny_z.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyRBte5jV1JCCp3FROc9Ro2K2Iti7499AGxWOvcHdL1gWI8jzO4IwXcqIgAZ-q-5xGTqnosNvR4-f-3byxGTiXqjFBC7EEOiCsHNxc1xjUhLbSEucPFURgABMyrecFSAi9XT7v1eGoEkQ9/s1600/bunny_z.png" height="258" width="320" /><br /><b>実行後</b></a></div>
<br />
<br />
1つの関数にまとめてしまっても良かったが、後の混乱を回避するためそれぞれの回転に分けた。実行に際しては回転する角度を-180~180でしていする。今回はX軸を-90°回転させた。Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-2067864553824275192015-02-26T13:57:00.001+09:002015-02-26T13:57:11.171+09:00物事を論じる際に注意すべきこと 日本人は議論が下手だとよく言われる。それに関しては、我々は議論や討論を行う訓練をつんでいないため仕方がないと思う。議論の際にその議論をより良いものとできるように留意しなければならないと考えたものをいかにまとめてみた。<br />
<br />
議論するときにやめるべきこと<br />
<ul>
<li>意見を述べている人を遮って意見を述べない。</li>
<ul>
<li>当然である。議論は相手の意見がなくてはできない。演説がしたいならば壁にでも向かってやればよい</li>
</ul>
</ul>
<ul>
<li>主題と関連しているが、限定的、局所的な例などを用いない、付け足さない。</li>
<ul>
<li>これはわき道にそらしていることに他ならない。自身の意見をなんとか通したい場合にありがちの手段である。要は主題と正面から向き合っていない。 </li>
</ul>
</ul>
<ul>
<li> 感情論を持ち込まない。</li>
<ul>
<li>感情的な意見の根拠は自分自身でしかない、つまり相手はそれを観測することは絶対にできない。よってそういった意見を述べられてもなにもすることができない。</li>
</ul>
</ul>
<ul>
<li>相手の人格、性格を否定する。</li>
<ul>
<li>主題をはるか遠くへ追いやる行為にである。やる意味がない。意見を交わす議論ではなく単なる悪口になってしまう。 </li>
</ul>
</ul>
<ul>
</ul>
<ul>
</ul>
<br />
自分がこれを完璧にできているかと言われればおそらくNOであるが、常に心がけることによって議論はよりよいものになると思う。<br />
よくありがちなのは並行線の議論となってしまった際でもどちらか一方を勝者としてしまおうとすることである。これもまた避けるべきである。時には結論がないという結果もある。 <br />
他にもあればご指摘を賜りたい。<br />
<ul>
</ul>
Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com1tag:blogger.com,1999:blog-2881629368794017135.post-17089865990499270042015-02-25T14:09:00.001+09:002015-02-25T14:09:59.131+09:002つの点群データを比較して片方にない点群を取り出す PCLではOctreeを使って2つの点群を比較し、その差分(片方に無いもの)を取り出す機能がある。なにが便利かというと、静的な(動きがない)環境で唯一動いているものがあればそれを検出できるということ。絶対に何者かが入って行動することがないような場所だとこのOctreeは使える。もちろん実環境は動的なので使うのは難しい。以下コード<br />
<br />
<div style="text-align: center;">
<b><u>コード</u></b></div>
<br />
#include "stdafx.h"<br />
<br />
#include <pcl/point_cloud.h><br />
#include <pcl/octree/octree.h><br />
#include <pcl/io/pcd_io.h><br />
<br />
#include <iostream><br />
#include <vector><br />
#include <ctime><br />
<br />
<br />
pcl::PointCloud<pcl::PointXYZ> difference_extraction(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_base, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_test)<br />
{<br />
//cloud_baseは元となる点群<br />
//cloud_testは比較対象の点群<br />
//cloud_diffは比較の結果差分とされた点群<br />
<br />
double resolution = 0.00001;//Octreeの解像度を指定<br />
<br />
pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree (resolution);//Octreeを作成<br />
<br />
octree.setInputCloud (cloud_base);//元となる点群を入力<br />
octree.addPointsFromInputCloud ();<br />
<br />
octree.switchBuffers ();//バッファの切り替え<br />
<br />
octree.setInputCloud (cloud_test);//比較対象の点群を入力<br />
octree.addPointsFromInputCloud ();<br />
<br />
std::vector<int> newPointIdxVector;//<br />
<br />
octree.getPointIndicesFromNewVoxels (newPointIdxVector);//比較の結果差分と判断された点郡の情報を保管<br />
<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_diff (new pcl::PointCloud<pcl::PointXYZ> );//出力先<br />
<br />
<br />
//保管先のサイズの設定<br />
cloud_diff->width = cloud_base->points.size() + cloud_test->points.size();<br />
cloud_diff->height = 1;<br />
cloud_diff->points.resize (cloud_diff->width * cloud_diff->height); <br />
<br />
int n = 0;//差分点群の数を保存する<br />
for(size_t i = 0; i < newPointIdxVector.size (); i++)<br />
{<br />
cloud_diff->points[i].x = cloud_test->points[newPointIdxVector[i]].x;<br />
cloud_diff->points[i].y = cloud_test->points[newPointIdxVector[i]].y;<br />
cloud_diff->points[i].z = cloud_test->points[newPointIdxVector[i]].z;<br />
n++;<br />
}<br />
//差分点群のサイズの再設定<br />
cloud_diff->width = n;<br />
cloud_diff->height = 1;<br />
cloud_diff->points.resize (cloud_diff->width * cloud_diff->height);<br />
<br />
return *cloud_diff;<br />
}<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
srand ((unsigned int) time (NULL));<br />
<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_base (new pcl::PointCloud<pcl::PointXYZ> );<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_test (new pcl::PointCloud<pcl::PointXYZ> );<br />
<br />
pcl::io::loadPCDFile(argv[1],*cloud_base);<br />
pcl::io::loadPCDFile(argv[2], *cloud_test);<br />
<br />
pcl::io::savePCDFileBinary("difference.pcd", difference_extraction(cloud_base, cloud_test));<br />
<br />
return (0);<br />
}<br />
<br />
<div style="text-align: center;">
<b><u>実行結果</u></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgilyIurwcpq02ncLk2BRRQ7qYOI0n-TfqFZ3Eg4S3QICg0EMNBND2tvzTxfXjotBRMg6QiWR-c7i-d5TG4BGobb_iCKVCPAt0GVVQ5VvSbMo2cyA3hbH44bM2LdVk4KpK8o0XRs1ZImWix/s1600/base.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgilyIurwcpq02ncLk2BRRQ7qYOI0n-TfqFZ3Eg4S3QICg0EMNBND2tvzTxfXjotBRMg6QiWR-c7i-d5TG4BGobb_iCKVCPAt0GVVQ5VvSbMo2cyA3hbH44bM2LdVk4KpK8o0XRs1ZImWix/s1600/base.png" height="258" width="320" /><br />基とするデータ</a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXz3FWTvzoiPMgTqicakakkMkJc5LI5e0OsSbfBqJzMIf2afN1MVawak6AhlwM48qH1Vmgz1kJ98J2GkgDg0RQBTOqULnfP565NyYcVz98ycSDWbBEmpdkCD-SxoKGddDfoZN8dYDF0d_M/s1600/test.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXz3FWTvzoiPMgTqicakakkMkJc5LI5e0OsSbfBqJzMIf2afN1MVawak6AhlwM48qH1Vmgz1kJ98J2GkgDg0RQBTOqULnfP565NyYcVz98ycSDWbBEmpdkCD-SxoKGddDfoZN8dYDF0d_M/s1600/test.png" height="258" width="320" /><br />比較対象</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIk4hxPFsTE1_dj_-Hhtlp2aVqJRwNc5LehrOHhGjC8HzeKlOgxM0SJTaRrkY_9LkRgRhn5oPDwv23gFTKsVsGb8tmCgzzr7T73i7W0TxIlHGNP976C72fqniU_JKISS0XTag_VCsuOuMW/s1600/diff.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIk4hxPFsTE1_dj_-Hhtlp2aVqJRwNc5LehrOHhGjC8HzeKlOgxM0SJTaRrkY_9LkRgRhn5oPDwv23gFTKsVsGb8tmCgzzr7T73i7W0TxIlHGNP976C72fqniU_JKISS0XTag_VCsuOuMW/s1600/diff.png" height="258" width="320" /><br />差分取得後</a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
今回<b>resolution</b>を極めて小さい値にしているが本来はもっと大きくしておかないと全て差分として検出されてしまうから注意が必要(センサから得られる情報はたとえ同じ地点の情報でも若干上下したりする)。<b>resolution</b>を小さくしているのは用意したデータがどちらも静的なものであるから。<br />
<br />
<br />
このOctreeは一応警備システムなどにも使えるのではないかと思う。人の活動がなくなる時間帯に起動しておいて、なにもない状況を登録→変化があればその場面を保存。みたいな流れ。Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-52582199489559036072015-02-25T11:40:00.002+09:002015-02-25T11:40:21.549+09:00点群の数を減少させる 法線の推定などは入力された点群データの全ての点について、一定範囲内の近隣の点を探し、それらを基に法線を推定していた。この処理は点の数が多いほど時間が増大する。Kinectを使用する場合だと得られる点群の数が理論上307200個なので膨大な時間を要し、リアルタイムに処理を行う必要がある場面では、なにかしらの前処理を行って、点群の数を減らす必要がある。<br />
PCLではダウンサンプリングと呼ばれる手法が用いられる。このダウンサンプリングは一定の範囲内にある点の中心に新たな点を配し、それ以外の点は全て削除する機能である。ちなみにこのダウンサンプリングの正式な名前はVoxelGridFilterという。点群の密度は状況によって大きく変わるのでここでは点群情報の体積から範囲を決定する。<br />
<br />
<div style="text-align: center;">
<b><u>コード</u></b></div>
<br />
#include "stdafx.h"<br /><br />#include <iostream><br />#include <pcl/io/pcd_io.h><br />#include <pcl/io/io.h><br />#include <pcl/point_types.h><br />#include <pcl/filters/voxel_grid.h><br /><br />pcl::PointCloud<pcl::PointXYZ> voxel_grid(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />{<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);<br /><br /> double max_height = 0, max_width = 0, max_length = 0;<br /> double min_height = 0, min_width = 0, min_length = 0;<br /> double height = 0, width = 0, length = 0;<br /><br /> for(size_t i = 0; i < cloud->points.size(); i++){//入力点群の縦横高さの最大値と最小値を計算する<br /> if(max_height > cloud->points[i].z)<br /> max_height = max_height;<br /> else<br /> max_height = cloud->points[i].z;<br /><br /> if(max_width > cloud->points[i].y)<br /> max_width = max_width;<br /> else<br /> max_width = cloud->points[i].y;<br /><br /> if(max_length > cloud->points[i].x)<br /> max_length = max_length;<br /> else<br /> max_length = cloud->points[i].x;<br /><br /> if(min_height < cloud->points[i].z)<br /> min_height = min_height;<br /> else<br /> min_height = cloud->points[i].z;<br /><br /> if(min_width < cloud->points[i].y)<br /> min_width = min_width;<br /> else<br /> min_width = cloud->points[i].y;<br /><br /> if(min_length < cloud->points[i].x)<br /> min_length = min_length;<br /> else<br /> min_length = cloud->points[i].x;<br /><br /> }<br /><br /> height = fabs(max_height) + fabs(min_height);<br /> width = fabs(max_width) + fabs(min_width);<br /> length = fabs(max_length) + fabs(min_length);<br /><br /> double model_volume = 0, voxel_volume, voxel_length = 0;<br /> model_volume = height * width * length;<br /> voxel_volume = model_volume / 150000; <br /><br /> voxel_length = pow(voxel_volume, 1.0 / 3.0);<br /><br /> pcl::VoxelGrid<pcl::PointXYZ> sor;<br /> sor.setInputCloud (cloud);<br /> //sor.setLeafSize (0.01f, 0.01f, 0.01f);<br /> sor.setLeafSize(voxel_length, voxel_length, voxel_length);<br /> sor.filter (*cloud_filtered);<br /><br /> return *cloud_filtered;<br />}<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br /> <br /> pcl::io::loadPCDFile(argv[1], *cloud); <br /><br /> <br /> std::stringstream Filename;<br /> std::string name = argv[1];<br /> name.erase(name.length()-4);<br /> Filename << name << "_voxel.pcd";<br /><br /> pcl::io::savePCDFileBinary(Filename.str(), voxel_grid(cloud));<br /><br /> return (0); <br />}<br />
<br />
<br />実行結果<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh71424MgijrgouPdSYSXPXKuNRcgJpWOBGmEFefpl_wizfXr3-SKd9ztxJQrOt2odDJFuAQOG1GD1WgvWKumqqJ2-t0D0m0NiQu172Pk5LUjqLvbfDTi3dCgPuO5BNuycfCxujDAVlHlQQ/s1600/voxel_before.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh71424MgijrgouPdSYSXPXKuNRcgJpWOBGmEFefpl_wizfXr3-SKd9ztxJQrOt2odDJFuAQOG1GD1WgvWKumqqJ2-t0D0m0NiQu172Pk5LUjqLvbfDTi3dCgPuO5BNuycfCxujDAVlHlQQ/s1600/voxel_before.png" height="258" width="320" /><br />処理前</a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqrD4fGCFFwdNrKp_j4Ahu85KD6Tp1yO3TzK3ZkHEwfOTeKKHdcE9Dg_5eZ86cnqst2gnEgb25JEtuwqejQrodeC2lwOExSuHbKJPXLt9F8EG3o-iqmu0Rob4Lvqcp3fHCjBx5GB8AKVOE/s1600/voxel_after.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqrD4fGCFFwdNrKp_j4Ahu85KD6Tp1yO3TzK3ZkHEwfOTeKKHdcE9Dg_5eZ86cnqst2gnEgb25JEtuwqejQrodeC2lwOExSuHbKJPXLt9F8EG3o-iqmu0Rob4Lvqcp3fHCjBx5GB8AKVOE/s1600/voxel_after.png" height="258" width="320" /><br />処理後</a></div>
<br />
<br />
このプログラムによって点群の数を減らし、処理速度の向上などを見込む事ができる。しかし、この処理は<a href="http://virtuemarket-lab.blogspot.jp/2015/02/blog-post_24.html" target="_blank">PassThroughFilter</a>と同様、点が有用であるかどうか問わずに削除を行うので注意が必要。もしそれが嫌だったら高機能なコンピュータを容易するかGPUに処理を手伝わせるなどする必要がある。自分はGPUに処理の一部を投げる方法はまだ知らない。Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-45721457212405182052015-02-25T11:21:00.002+09:002015-02-25T11:30:57.171+09:002つの点郡データを1つに統合する これはチュートリアルにあるのをそのまま使えばいい話だが一応記事にしておく<br />
引数に与えられた2つのPCDファイルをひとつにまとめて表示+保存するプログラム。<br />
<br />
<div style="text-align: center;">
<b><u>コード</u></b></div>
<br />
#include "stdafx.h"<br />
<br />
#include <iostream><br />
#include <pcl/io/pcd_io.h><br />
#include <pcl/io/io.h><br />
#include <pcl/point_types.h><br />
<br />
pcl::PointCloud<pcl::PointXYZ> merge_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2)<br />
{<br />
pcl::PointCloud<pcl::PointXYZ> cloud_merged;//2つの点群をまとめて格納する<br />
cloud_merged = *cloud1;//1つ目の点群を統合先に格納する<br />
cloud_merged += *cloud2;//2つ目の点群を統合先に格納する。<br />
<br />
return cloud_merged;<br />
}<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1 (new pcl::PointCloud<pcl::PointXYZ>);<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2 (new pcl::PointCloud<pcl::PointXYZ>);<br />
<br />
<br />
pcl::io::loadPCDFile(argv[1], *cloud1);<br />
pcl::io::loadPCDFile(argv[2], *cloud2);<br />
<br />
pcl::io::savePCDFileBinary("merged.pcd" , merge_cloud(cloud1, cloud2));<br />
<br />
return (0); <br />
}<br />
<br />
<br />
<br />
まぁ大して面白くもない、ただただ2つの点郡を1つのファイルにまとめるだけ。Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-60614899424337251952015-02-24T16:18:00.003+09:002015-02-24T16:23:15.677+09:00各点の法線の計算とその法線の表示 3次元の点郡を扱う上で重要になってくるのが各点が持つ法線である。3次元点郡を扱う研究では、頻繁にこの法線を使う。ものによってはこの法線情報のみを特徴として人間の検知をやってしまっている研究さえある。今回は入力された点郡の法線を取得して表示するプログラムを作る。<br />
<u>今のところPCLのチュートリアルの機能を関数化したりしてるだけだが、ここで作った関数を後で切り貼りすると大きな機能を含んだプログラムを作るのが容易になるはず。 </u><br />
<br />
<div style="text-align: center;">
<u><b>コード</b></u></div>
<br />
#include "stdafx.h"<br />
<br />
#include <iostream><br />
#include <pcl/io/pcd_io.h><br />
#include <pcl/io/io.h><br />
#include <pcl/point_types.h><br />
#include <pcl/features/normal_3d.h><br />
#include <pcl/visualization/pcl_visualizer.h><br />
<br />
pcl::PointCloud<pcl::Normal>::Ptr surface_normals(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />
{<br />
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;<br />
ne.setInputCloud (cloud);//法線の計算を行いたい点群を指定する<br />
<br />
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());//KDTREEを作る<br />
ne.setSearchMethod (tree);//検索方法にKDTREEを指定する<br />
<br />
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);//法線情報を入れる変数<br />
<br />
ne.setRadiusSearch (0.005);//検索する半径を指定する<br />
<br />
ne.compute (*cloud_normals);//法線情報の出力先を指定する<br />
<br />
return cloud_normals;<br />
}<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br />
pcl::io::loadPCDFile(argv[1], *cloud);<br />
<br />
surface_normals(cloud);<br />
<br />
std::stringstream Filename;<br />
std::string name;<br />
name = argv[1];<br />
name.erase(name.length()-4);<br />
Filename << name << "_normal.pcd";<br />
<br />
pcl::io::savePCDFileBinary(Filename.str() , *surface_normals(cloud));<br />
<br />
pcl::visualization::PCLVisualizer viewer ("3D Viewer");<br />
viewer.setBackgroundColor(1.0,0.5,1.0);<br />
viewer.addPointCloud<pcl::PointXYZ> (cloud, "Input cloud");<br />
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,3,"Input cloud");<br />
viewer.addPointCloudNormals<pcl::PointXYZ,pcl::Normal>(cloud,surface_normals(cloud),10,0.05,"normals");<br />
<br />
while(!viewer.wasStopped())<br />
{<br />
viewer.spinOnce (100);<br />
}<br />
return (0); <br />
}<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="data:image/png;base64,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" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" height="258" src="data:image/png;base64,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" width="320" /><br />実行結果</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
以前作ったViewerでは法線の表示はできないので今回は法線を表示できるViewerをつけている。<br />
この法線推定プログラムの処理にはそこそこの時間を要する、この理由は各点の周辺(指定した半径)の点の数から法線を求める処理を全ての入力点に対して行っているためである。なので処理を短くしたい場合は、点群の数を減らすなどの工夫が必要。 Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-89242794194310736852015-02-24T15:13:00.002+09:002015-02-24T16:22:05.711+09:00センサから取得された点郡の不要データを除去するフィルタ Kinectなどのセンサは通常307200個の点郡が取れるはずであるが、あくまでも赤外線を照射して帰ってきた情報しか取得できないため、ガラスなどの点郡はとることができない。しかし、一応データは存在するものとして扱われる(QNANのような感じになり、Viewerなどでは表示されない)そういったデータは処理の邪魔でしかないので消去するべきなのでPCLではPassThroughフィルタというものがあるのでそれを使用することで消去できる。以下入力された点郡データの使用できないデータを消去するコード。<br />
<div style="text-align: center;">
<u><b><br /></b></u></div>
<div style="text-align: center;">
<u><b>コード</b></u></div>
<br />
#include "stdafx.h"<br />
<br />
#include <iostream><br />
#include <pcl/point_types.h><br />
#include <pcl/filters/passthrough.h><br />
#include <pcl/io/pcd_io.h><br />
<br />
<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr pass_through(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);<br />
pcl::PassThrough<pcl::PointXYZ> pass;<br />
pass.setInputCloud (cloud);<br />
pass.setFilterFieldName ("z");<br />
pass.setFilterLimits (0, 10);<br />
//pass.setFilterLimitsNegative (true);<br />
pass.filter (*cloud_filtered);<br />
printf("%f\n",cloud->points.size());<br />
<br />
return cloud_filtered;<br />
}<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br />
<br />
pcl::io::loadPCDFile(argv[1], *cloud);<br />
//pass_through(cloud);<br />
<br />
std::stringstream Filename;<br />
std::string name;<br />
name = argv[1];<br />
name.erase(name.length()-4);<br />
Filename << name << "_pass.pcd";<br />
<br />
pcl::io::savePCDFileBinary(Filename.str() , *pass_through(cloud));<br />
<br />
return (0); <br />
}<br />
<br />
<br />
このフィルタは通常は表示するデータのX、Y、Zの値を元にして、閾値以上となった場合は表示しないなどの処理を行うものであるが、今回のように「存在しない」という情報を持つ点の削除を行うこともできる。 以下Z座標値が0~0.05の場合のみ表示するコード。<br />
<br />
<div style="text-align: center;">
<b><u>コード</u></b></div>
<br />
#include "stdafx.h"<br />
<br />
#include <iostream><br />
#include <pcl/point_types.h><br />
#include <pcl/filters/passthrough.h><br />
#include <pcl/io/pcd_io.h><br />
<br />
<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr pass_through(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);<br />
pcl::PassThrough<pcl::PointXYZ> pass;<br />
pass.setInputCloud (cloud);<br />
pass.setFilterFieldName ("z");<br />
pass.setFilterLimits (0, <u><i><b>0.05</b></i></u>);<br />
//pass.setFilterLimitsNegative (true);<br />
pass.filter (*cloud_filtered);<br />
printf("%f\n",cloud->points.size());<br />
<br />
return cloud_filtered;<br />
}<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br />
<br />
<br />
pcl::io::loadPCDFile(argv[1], *cloud);<br />
//pass_through(cloud);<br />
<br />
std::stringstream Filename;<br />
std::string name;<br />
name = argv[1];<br />
name.erase(name.length()-4);<br />
Filename << name << "_pass.pcd";<br />
<br />
pcl::io::savePCDFileBinary(Filename.str() , *pass_through(cloud));<br />
<br />
return (0); <br />
}<br />
<br />
<br />
<br />
このコードの実行結果<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT4r2kJeI4cULwwIbIV-_-PolArwZUAYYN_yoeqGJxI_FFTX-5xSVAH7ZrmUtuOkizzGSiLaLXDZfi7kLRW4mjOEDVbqJv4wn287ws54gg3aNpNvzT3CoX01UgAZGmOCriwURRiCWFcvJ_/s1600/bunny_orig.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT4r2kJeI4cULwwIbIV-_-PolArwZUAYYN_yoeqGJxI_FFTX-5xSVAH7ZrmUtuOkizzGSiLaLXDZfi7kLRW4mjOEDVbqJv4wn287ws54gg3aNpNvzT3CoX01UgAZGmOCriwURRiCWFcvJ_/s1600/bunny_orig.png" height="258" width="320" /></a> </div>
<div class="" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcBqptvjGv2ftJEMy3cFoFCs0vM7I1CojyQA8fJ5bq7uHMhpa3f81t6rFGylR7weX0w8_QAhU89qgikdQ0Jc4GdCcgPcJY8zg9Crb9D31Tc0NpTSG71ojLRpzaXENqRMA8DLfeWtKP9HDN/s1600/bunny_pass.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><b>元の点群データ</b></a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcBqptvjGv2ftJEMy3cFoFCs0vM7I1CojyQA8fJ5bq7uHMhpa3f81t6rFGylR7weX0w8_QAhU89qgikdQ0Jc4GdCcgPcJY8zg9Crb9D31Tc0NpTSG71ojLRpzaXENqRMA8DLfeWtKP9HDN/s1600/bunny_pass.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcBqptvjGv2ftJEMy3cFoFCs0vM7I1CojyQA8fJ5bq7uHMhpa3f81t6rFGylR7weX0w8_QAhU89qgikdQ0Jc4GdCcgPcJY8zg9Crb9D31Tc0NpTSG71ojLRpzaXENqRMA8DLfeWtKP9HDN/s1600/bunny_pass.png" height="258" width="320" /></a></div>
</div>
<div class="" style="clear: both; text-align: center;">
<b><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcBqptvjGv2ftJEMy3cFoFCs0vM7I1CojyQA8fJ5bq7uHMhpa3f81t6rFGylR7weX0w8_QAhU89qgikdQ0Jc4GdCcgPcJY8zg9Crb9D31Tc0NpTSG71ojLRpzaXENqRMA8DLfeWtKP9HDN/s1600/bunny_pass.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">処理後の点群データ</a></b></div>
<br />
斜体+下線+太字の部分の値を変えただけ、ものは全く同じ。<br />
このフィルタを使えば表示する点郡の数を減らせるので処理を速くできる。(有用不要にかかわらず情報の削除を行うので注意は必要)
<!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F1.bp.blogspot.com%2F-kFNXuqiRdOE%2FVOwV6Em8LzI%2FAAAAAAAAABc%2FL9W2EJ8ic3M%2Fs1600%2Fbunny_pass.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcBqptvjGv2ftJEMy3cFoFCs0vM7I1CojyQA8fJ5bq7uHMhpa3f81t6rFGylR7weX0w8_QAhU89qgikdQ0Jc4GdCcgPcJY8zg9Crb9D31Tc0NpTSG71ojLRpzaXENqRMA8DLfeWtKP9HDN/s1600/bunny_pass.png" -->Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-41697374372966023882015-02-24T14:33:00.001+09:002015-02-24T16:21:55.020+09:00点郡の重心座標を計算して全体を移動させるプログラム 通常Kinectから得られる点郡データはz軸(奥行き)方向に一定の距離があるはずだが、色々処理をしたい場合は座標(0,0,0)にあったほうがやり易かったりするので、入力点郡の重心を求め、全体をその重心の座標が(0,0,0)になるように移動するプログラムを作る。<br />
<br />
<div style="text-align: center;">
<b><u>コード</u></b></div>
<br />
#include "stdafx.h"<br />
<br />
#include <iostream><br />
#include <boost/thread/thread.hpp><br />
#include <pcl/common/common_headers.h><br />
#include <pcl/features/normal_3d.h><br />
#include <pcl/io/pcd_io.h><br />
void centroid(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)<br />
{<br />
Eigen::Vector4f xyz_centroid;<br />
pcl::compute3DCentroid(*cloud, xyz_centroid);//重心を計算<br />
<br />
for(size_t i = 0; i < cloud->points.size(); i++){<br />
cloud->points[i].x = cloud->points[i].x - xyz_centroid[0];//X座標の移動<br />
cloud->points[i].y = cloud->points[i].y - xyz_centroid[1];//Y座標の移動<br />
cloud->points[i].z = cloud->points[i].z - xyz_centroid[2];//Z座標の移動<br />
}<br />
}<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);<br />
<br />
pcl::io::loadPCDFile(argv[1], *cloud);<br />
<br />
centroid(cloud);//重心計算+移動の関数に点群を渡す。<br />
<br />
std::stringstream Filename;<br />
std::string name;<br />
name = argv[1];<br />
name.erase(name.length()-4);<br />
Filename << name << "_C.pcd";//最初に渡されたファイル名の末尾に_Cを付加する<br />
pcl::io::savePCDFileBinary(Filename.str(),*cloud);<br />
}<br />
<br />
<br />
<br />
このコードは前回のViewerのように引数にPCDファイルを読み込み、重心を座標(0,0,0)に移動後、別名で保存する。保存時のファイル名は引数で渡したファイル名の末尾に「_C」を加えるAnonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-10313229919728824062015-02-23T13:54:00.001+09:002015-02-23T15:10:22.934+09:00保存された点群の表示 Kinectからの点群データの取得はできるようになったはずなのでそのデータを以前に作ったViewerで表示する。<br />
一々プログラムを書き換えて読み込むファイルを指定するのは面倒なので引数を使用してPCDファイルならエラーなく読み込めるプログラムにする。尚前のViwerには、球体を表示する関数があったがそれは削除する。<br />
<br />
<div style="text-align: center;">
<u><b>コード</b></u></div>
<br />
<div style="text-align: left;">
<span style="color: blue;">#include</span> "stdafx.h"<br />
<br />
<span style="color: blue;">#include</span> <pcl/visualization/cloud_viewer.h><br />
<span style="color: blue;">#include</span> <iostream></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;">#include</span> <pcl/io/io.h></span><span class="cp"> </span></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;">#include</span> <pcl/io/pcd_io.h></span><br />
<br />
<span class="cp">void viewerOneOff (pcl::visualization::PCLVisualizer& viewer)</span></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;"><span style="color: black;">{</span></span></span><br />
<span class="cp"><span style="color: blue;"><span style="color: black;"> </span></span></span><span class="cp"><span style="color: blue;"><span style="color: black;"> viewer.setBackgroundColor (1.0, 0.5, 1.0);</span></span></span><br />
<span class="cp"><span style="color: blue;"><span style="color: black;">}<br /><br /><span style="color: blue;">int</span> _tmain(<span style="color: blue;">int</span> argc, _TCHAR* argv[])<br />{</span></span></span><br />
<span class="cp"><span style="color: blue;"><span style="color: black;"></span></span></span><br />
<span class="cp"><span style="color: blue;"><span style="color: black;"> <i><b><u>pcl::PointCloud<pcl::PointXYZRGBA> cloud; //点群を入れる変数</u></b></i></span></span></span><br />
<span class="cp"><span style="color: blue;"><span style="color: black;"> <u><i><b>pcl::io::loadPCDFile (argv[1], cloud);//保存されている点群データの読み込み</b></i></u></span></span></span><br />
<span class="cp"><span style="color: blue;"><span style="color: black;"> pcl::visualization::CloudViewer viewer("Cloud Viewer");//Viewerの作成<br /> viewer.runOnVisualizationThreadOnce (viewerOneOff);//背景色の設定</span></span></span><br />
<span class="cp"><span style="color: blue;"><span style="color: black;"> <u><i><b>viewer.showCloud(cloud.makeShared());//点群の表示</b></i></u><br /> <span style="color: blue;">while</span> (!viewer.wasStopped ())<br /> {<br /> }<br /> <span style="color: blue;">return</span> 0;<br />}</span></span></span><br />
<br />
<span class="cp"><span style="color: blue;"><span style="color: black;">変更点はいつものように斜体+下線+太字の部分。ダブルスラッシュのあとにはその行の説明。この書き方だとドラッグ&ドロップでもプログラムを起動して表示できる。</span></span></span><br />
<br />
<span class="cp"><span style="color: blue;"><span style="color: black;">動的に点群情報を変化させたりしない場合は、このViewerに点群を操作したり除去したりする機能を追加すればいい。 下の画像は実際にこのプログラムにファイルを読み込ませた結果。本来は色付きだったけど色は黒に一括変更されているものを使用した。</span></span></span><br />
<span class="cp"><span style="color: blue;"><span style="color: black;"><i><b><u>pcl::PointCloud<pcl::PointXYZRGBA> cloud;</u></b></i> の </span></span></span><span class="cp"><span style="color: blue;"><span style="color: black;"><i><b><u>PointXYZRGBA</u></b></i> を</span></span></span><span class="cp"><span style="color: blue;"><span style="color: black;"><i><b><u>PointXYZ</u></b></i> などに変更すると色情報なしで表示できるようになる。</span></span></span><br />
<span class="cp"><span style="color: blue;"><span style="color: black;"> </span></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNhjALxNJBy2fZvz1DlRYOpWXywbKPQdbV0t7EKOr-VcaelqpXdAP0gAn1YBcjS1uYClnAmNWBaNxy6CNwQJ1LVaLVNSY7fU_POnrdyJ_hTShQI6GgpwkVXWMm_y9CEkcuM5vNFKLgNMTY/s1600/chair_pcd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNhjALxNJBy2fZvz1DlRYOpWXywbKPQdbV0t7EKOr-VcaelqpXdAP0gAn1YBcjS1uYClnAmNWBaNxy6CNwQJ1LVaLVNSY7fU_POnrdyJ_hTShQI6GgpwkVXWMm_y9CEkcuM5vNFKLgNMTY/s1600/chair_pcd.png" height="258" width="320" /></a></div>
</div>
Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-42208756837434664242015-02-23T13:19:00.000+09:002015-02-23T13:19:33.100+09:00Kinectからのデータ取得 PCLではKinectから点群データを取得する際はOpenNIを用いる。<br />
<br /> PCLのチュートリアルではリアルタイムにデータを取得→画面に表示を行っているのみで取得された点群データは保存されないので数行コードを足してやる必要がある。コードは以下<br />
<br />
<br />
<br />
<div style="text-align: center;">
<u><b>コード</b></u> </div>
<br />
<pre> <span class="cp">#include "stdafx.h"</span></pre>
<br />
<pre> <span class="cp">#include <pcl/io/openni_grabber.h></span>
<span class="cp">#include <pcl/visualization/cloud_viewer.h></span></pre>
<pre><span class="cp"> </span><i><b><u>#include <pcl/io/pcd_io.h></u></b></i> </pre>
<pre> </pre>
<pre> <span class="k">class</span> <span class="nc">SimpleOpenNIViewer</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="n">SimpleOpenNIViewer</span> <span class="p">()</span> <span class="o">:</span> <span class="n">viewer</span> <span class="p">(</span><span class="s">"PCL OpenNI Viewer"</span><span class="p">)</span> <span class="p">{}</span>
<span class="kt">void</span> <span class="n">cloud_cb_</span> <span class="p">(</span><span class="k">const</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o"><</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZ</span><span class="o">>::</span><span class="n">ConstPtr</span> <span class="o">&</span><span class="n">cloud</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">viewer</span><span class="p">.</span><span class="n">wasStopped</span><span class="p">())</span>
<span class="n">viewer</span><span class="p">.</span><span class="n">showCloud</span> <span class="p">(</span><span class="n">cloud</span><span class="p">);</span> </pre>
<pre> <u><b><i>pcl::io::savePCDFileBinary("pointcloud.pcd", *cloud);</i></b></u></pre>
<pre> <span class="p"> }</span>
<span class="kt">void</span> <span class="n">run</span> <span class="p">()</span>
<span class="p">{</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">Grabber</span><span class="o">*</span> <span class="n">interface</span> <span class="o">=</span> <span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">OpenNIGrabber</span><span class="p">();</span>
<span class="n">boost</span><span class="o">::</span><span class="n">function</span><span class="o"><</span><span class="kt">void</span> <span class="p">(</span><span class="k">const</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o"><</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZ</span><span class="o">>::</span><span class="n">ConstPtr</span><span class="o">&</span><span class="p">)</span><span class="o">></span> <span class="n">f</span> <span class="o">=</span>
<span class="n">boost</span><span class="o">::</span><span class="n">bind</span> <span class="p">(</span><span class="o">&</span><span class="n">SimpleOpenNIViewer</span><span class="o">::</span><span class="n">cloud_cb_</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="n">_1</span><span class="p">);</span>
<span class="n">interface</span><span class="o">-></span><span class="n">registerCallback</span> <span class="p">(</span><span class="n">f</span><span class="p">);</span>
<span class="n">interface</span><span class="o">-></span><span class="n">start</span> <span class="p">();</span>
<span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">viewer</span><span class="p">.</span><span class="n">wasStopped</span><span class="p">())</span>
<span class="p">{</span>
<span class="n">boost</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">sleep</span> <span class="p">(</span><span class="n">boost</span><span class="o">::</span><span class="n">posix_time</span><span class="o">::</span><span class="n">seconds</span> <span class="p">(</span><span class="mi">1</span><span class="p">));</span>
<span class="p">}</span>
<span class="n">interface</span><span class="o">-></span><span class="n">stop</span> <span class="p">();</span>
<span class="p">}</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">visualization</span><span class="o">::</span><span class="n">CloudViewer</span> <span class="n">viewer</span><span class="p">;</span>
<span class="p">};</span>
<span class="kt">int</span> <span class="nf">_tmain</span> <span class="p">(int argc, _TCHAR* argv[])</span>
<span class="p">{</span>
<span class="n">SimpleOpenNIViewer</span> <span class="n">v</span><span class="p">;</span>
<span class="n">v</span><span class="p">.</span><span class="n">run</span> <span class="p">();</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></pre>
<pre><span class="p"> </span></pre>
<pre><span class="p"> 以上</span></pre>
<pre><span class="p"> </span></pre>
<pre><span class="p"> 斜体+下線+太字にした部分はチュートリアルには無い部分でその部分で取得されたデー</span></pre>
<pre><span class="p">タを保存する。</span></pre>
<pre><span class="p"> このコードではプログラムが終了した瞬間のデータを保存するだけなので、起動した瞬間</span></pre>
<pre><span class="p">から全てのデータを1フレームずつ保存した場合は保存するファイル名を動的に変えたりする</span></pre>
<pre><span class="p">必要がある。</span></pre>
Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0tag:blogger.com,1999:blog-2881629368794017135.post-59351511941367796342015-02-22T14:42:00.001+09:002015-02-22T14:42:06.999+09:00PCLの動作の確認 <a href="http://virtuemarket-lab.blogspot.jp/2015/02/point-cloud-library.html" target="_blank">一つ前の記事</a>でプロジェクトの設定などは完了しているので、ちゃんと動作するかの確認のためにPCLを使った短いコードを動かしてみる。<br />
<br />
<div style="text-align: center;">
<b><u>コード</u></b></div>
<div style="text-align: left;">
<span style="color: blue;"> </span></div>
<div style="text-align: left;">
<span style="color: blue;">#include</span> "stdafx.h"<br /><br /><span style="color: blue;">#include</span> <pcl/visualization/cloud_viewer.h><br /><span style="color: blue;">#include</span> <iostream></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;">#include</span> <pcl/io/io.h></span><span class="cp"> </span></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;">#include</span> <pcl/io/pcd_io.h></span></div>
<div style="text-align: left;">
<span class="cp"> </span></div>
<div style="text-align: left;">
<span class="cp"> </span></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;"><span style="color: black;"><span style="color: blue;">void </span>viewerOneOff (pcl::visualization::PCLVisualizer& viewer)<br />{<br /> viewer.setBackgroundColor (0.0, 0.0, 0.8);<br /> pcl::PointXYZ o;<br /> o.x = 0;<br /> o.y = 0;<br /> o.z = 0.5;<br /> viewer.addSphere (o, 0.25, "sphere", 0); <br />}<br /><br /><br /><span style="color: blue;">int</span> _tmain(<span style="color: blue;">int</span> argc, _TCHAR* argv[])<br />{<br /><br /> pcl::visualization::CloudViewer viewer("Cloud Viewer");<br /> viewer.runOnVisualizationThreadOnce (viewerOneOff);<br /> <span style="color: blue;">while</span> (!viewer.wasStopped ())<br /> {<br /> }<br /> <span style="color: blue;">return</span> 0;<br />}</span></span></span></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;"><span style="color: black;"> </span></span></span></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;"><span style="color: black;"> 上のコードをコンパイルして実行すると ↓のような画面が表示されるはず</span></span></span></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;"><span style="color: black;"> </span></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBvnybFGD_x0zCmBE9HRP3bO-EseoM3ds0X9xbj1RcoY5dvzebO0TJMBIa1esVFiFwTJPs-U0tIKJrLr5fyrP5X2oTs07rQ1KqkMWUu5gwRGp1B-YQme5Afz_WWzpMLYjOEEjAAFAqo-_Z/s1600/pcd_viewer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBvnybFGD_x0zCmBE9HRP3bO-EseoM3ds0X9xbj1RcoY5dvzebO0TJMBIa1esVFiFwTJPs-U0tIKJrLr5fyrP5X2oTs07rQ1KqkMWUu5gwRGp1B-YQme5Afz_WWzpMLYjOEEjAAFAqo-_Z/s1600/pcd_viewer.png" height="258" width="320" /></a></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;"><span style="color: black;"> </span></span></span></div>
<div style="text-align: center;">
<span class="cp"><span style="color: blue;"><span style="color: black;"><u><b>簡単な説明</b></u></span></span></span></div>
<div style="text-align: center;">
<span class="cp"><span style="color: blue;"><span style="color: black;"><u><b> </b></u></span></span></span></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;"><span style="color: black;"><b> </b>このプログラムは画像のような球体を表示するだけで<u><b></b></u>他には一切なにもしない。この球体はPCLの中にある関数の</span></span></span><span class="cp"><span style="color: blue;"><span style="color: black;"><span class="cp"><span style="color: blue;"><span style="color: black;"> <b><i>viewer.addSphere </i></b>で追加される。引数の一つ目には座標、2つ目は球体の半径、3つ目はID(通常は”sphere”)、4つ目は視点の位置。</span></span></span></span></span></span></div>
<div style="text-align: left;">
<span class="cp"><span style="color: blue;"><span style="color: black;"><span class="cp"><span style="color: blue;"><span style="color: black;"><b><i> </i></b>ちなみにこのViewerは古い版で最新のバージョンのPCLではもっと多機能なViewerを使うことができる。その分コードが若干面倒になる。ただただ点群を表示するだけならこれで十分</span></span></span></span></span></span></div>
Anonymoushttp://www.blogger.com/profile/05294738941213129758noreply@blogger.com0