Python のデータフレーム
このページでは, Point Cloud データセットの情報源を紹介します
さらに、SQLite 3 のテーブル pcdxyz を生成します。
◆ 作成するSQLite 3 データベース:pcddb
* データ源のURL
-  Point Clound Data Sets の Web ページ : 
http://www.pointclouds.org/news/2013/01/07/point-cloud-data-sets/
 
前準備
【関連する外部ページ】 stlop.html
CloudCompare
#!/bin/bash 
# CSV ファイル(レコード構造はx,y,z)の表示
function view_pcdcsv_xyz() {
cat >/tmp/a.$$.r<<RCOMMAND
  require(data.table)
  require(scatterplot3d)
  require(rgl)
  T <- data.table( read.csv(file="$1", header=FALSE, as.is=TRUE) )
  str(T) 
  plot3d(x = T\$V1, y = T\$V2, z = T\$V3, col=rainbow(1000) )
  Sys.sleep(100)
RCOMMAND
cat /tmp/a.$$.r | R --no-save
}
#
INFILE=/tmp/svn.pointclouds.org/ism_test_horse.pcd
fgrep -v PCD ${INFILE} | fgrep -v VERSION | fgrep -v FIELDS | fgrep -v SIZE | fgrep -v TYPE | fgrep -v COUNT | fgrep -v WIDTH | fgrep -v HEIGHT | fgrep -v VIEWPOINT | fgrep -v POINTS | fgrep -v DATA | sed 's/ /,/g' > /tmp/a.$$.csv 
view_pcdcsv_xyz /tmp/a.$$.csv
STL 形式, PLY 形式への変換
◆ STL 形式への変換と確認表示
#!/bin/bash
cd /tmp
cat >/tmp/hoge.mlx <<-MLX
<!DOCTYPE FilterScript>
<FilterScript>
 <filter name="Surface Reconstruction: Ball Pivoting">
  <Param type="RichAbsPerc" value="0" min="0" name="BallRadius" max="4113.47"/>
  <Param type="RichFloat" value="20" name="Clustering"/>
  <Param type="RichFloat" value="90" name="CreaseThr"/>
		       <Param type="RiclhBool" value="false" name="DeleteFaces"/>
 </filter>
</FilterScript>
MLX
# asc ファイル(レコード構造はx,y,z 区切りは半角スペース) を stlに変換
function ascxyz_to_pcl () {
  rm -f $2
  rm -f /tmp/hoge.$$.stl
  meshlabserver -i $1 -o /tmp/hoge.$$.stl -s $3
# hole (穴)に関する処理
  if [ -f /tmp/hoge.$$.stl ]; then 
    admesh -fudev -b $2 /tmp/hoge.$$.stl 
  fi
}
#
for INFILE in /tmp/svn.pointclouds.org/*.pcd /tmp/svn.pointclouds.org/*/*.pcd; do
  fgrep -v PCD ${INFILE} | fgrep -v VERSION | fgrep -v FIELDS | fgrep -v SIZE | fgrep -v TYPE | fgrep -v COUNT | fgrep -v WIDTH | fgrep -v HEIGHT | fgrep -v VIEWPOINT | fgrep -v POINTS | fgrep -v DATA | sed 's/ /,/g' > /tmp/a.$$.csv
  cat /tmp/a.$$.csv | sed 's/,/ /g' > `echo ${INFILE} | sed 's/.pcd/.asc/g'`
#
  ascxyz_to_pcl `echo ${INFILE} | sed 's/.pcd/.asc/g'` `echo ${INFILE} | sed 's/.pcd/.stl/g'` /tmp/hoge.mlx 
done
#
meshlab /tmp/hoge.stl
* MLX ファイルは、meshlab を起動し、「Filters」→「show current filter script」と操作し、スクリプトをファイルに保存する pcltomesh.html
◆ STL 形式から ply 形式への変換と確認表示
#!/bin/bash
cd /tmp
#
for INFILE in /tmp/svn.pointclouds.org/*.stl /tmp/svn.pointclouds.org/*/*.stl; do
  rm -f /tmp/hoge.ply
  echo /tmp/src/stl_ply $INFILE /tmp/hoge.ply
  /tmp/src/stl_ply $INFILE /tmp/hoge.ply
  if [ -f /tmp/hoge.ply ]; then 
     cp /tmp/hoge.ply `echo $INFILE | sed 's/stl/ply/g'`
  fi
done
#
meshlab /tmp/hoge.ply
pcdxyz テーブル作成手順
- SQLite 3 のデータベースファイル名: /tmp/pcddb
 - 生成されるテーブル: pcdxyz(name, x, y, z)
 
◆ テーブル作成
#!/bin/bash
cd /tmp
# drop old pcdxyz
cat > /tmp/a.$$.sql <<-SQL
  drop table pcdxyz; 
SQL
cat /tmp/a.$$.sql | sqlite3 /tmp/pcddb 
# define pcdxyz
cat > /tmp/a.$$.sql <<-SQL
create table pcdxyz (
   name         text, 
   x            real, 
   y            real, 
   z            real 
); 
SQL
cat /tmp/a.$$.sql | sqlite3 /tmp/pcddb 
# populate pcdxyz
cat > /tmp/a.$$.sql <<-SQL
.mode csv
.import "/tmp/a.$$.csv" pcdxyz
SQL
DIR=/tmp/svn.pointclouds.org 
cd ${DIR}
for i in *.pcd */*.pcd; do 
    echo $i 
    j=`basename $i .pcd`			
    fgrep -v PCD ism_test_cat.pcd | fgrep -v VERSION | fgrep -v FIELDS | fgrep -v SIZE | fgrep -v TYPE | fgrep -v COUNT | fgrep -v WIDTH | fgrep -v HEIGHT | fgrep -v VIEWPOINT | fgrep -v POINTS | fgrep -v DATA | sed 's/ /,/g'  | awk '{print"'$j', "$0}' > /tmp/a.$$.csv 
    cat /tmp/a.$$.sql | sqlite3 /tmp/pcddb 
done 
# simple test
echo "select * from pcdxyz limit 10;" | sqlite3 /tmp/pcddb
ダウンロードと確認表示
csv形式ファイルのプレビュー (R システムを使用)
#!/bin/bash 
# CSV ファイル(レコード構造はx,y,z,r,g,b)の表示
function view_pcdcsv_xyzrgb() {
cat >/tmp/a.$$.r<<RCOMMAND
  require(data.table)
  require(scatterplot3d)
  require(rgl)
  T <- data.table( read.csv(file="$1", header=FALSE, as.is=TRUE) )
  str(T) 
  plot3d(x = T\$V1, y = T\$V2, z = T\$V3, col=rgb(T\$V4/255.0, T\$V5/255.0, T\$V6/255.0) )
  Sys.sleep(100)
RCOMMAND
cat /tmp/a.$$.r | R --no-save
}
#
INFILE=/tmp/2013.09.05.06.41.47.563.csv
fgrep -v QNAN ${INFILE} > /tmp/a.$$.csv
 
view_pcdcsv_xyzrgb /tmp/a.$$.csv
STL 形式, PLY 形式への変換
◆ STL 形式への変換と確認表示
#!/bin/bash
cd /tmp
cat >/tmp/hoge.mlx <<-MLX
<!DOCTYPE FilterScript>
<FilterScript>
 <filter name="Surface Reconstruction: Ball Pivoting">
  <Param type="RichAbsPerc" value="0" min="0" name="BallRadius" max="4113.47"/>
  <Param type="RichFloat" value="20" name="Clustering"/>
  <Param type="RichFloat" value="90" name="CreaseThr"/>
		       <Param type="RiclhBool" value="false" name="DeleteFaces"/>
 </filter>
</FilterScript>
MLX
# asc ファイル(レコード構造はx,y,z 区切りは半角スペース) を stlに変換
function ascxyz_to_pcl () {
  rm -f $2
  rm -f /tmp/hoge.$$.stl
  meshlabserver -i $1 -o /tmp/hoge.$$.stl -s $3
# hole (穴)に関する処理
  if [ -f /tmp/hoge.$$.stl ]; then 
    admesh -fudev -b $2 /tmp/hoge.$$.stl 
  fi
}
#
  cut -d "," -f 1,2,3 /tmp/2013.09.05.06.41.47.563.csv | sed 's/,/ /g' | fgrep -v QNAN > /tmp/a.$$.asc
#
  ascxyz_to_pcl /tmp/a.$$.asc /tmp/2013.09.05.06.41.47.563.stl /tmp/hoge.mlx 
#
meshlab /tmp/2013.09.05.06.41.47.563.stl
* MLX ファイルは、meshlab を起動し、「Filters」→「show current filter script」と操作し、スクリプトをファイルに保存する pcltomesh.html
データソース
- /home/www/plat 下: 2013.09.05.06.41.47.563.pcd など
 -  /home/www/tagawa 下
2013/9/11 に撮影した田川市・伊田商店街のデータ
 - /home/www/plat/20130930 藤井くん、本田君、ラジオ体操計測生データ(アンドロイドとキネクト)
 - JR筑肥線のデータの最新版があるはずです
 - ラジオ体操の差し替え版があるはずです