OpenFrameworksを使った立体物のスキャニングと解析

f:id:dozensdozy:20180623013811p:plainf:id:dozensdozy:20180623013814p:plainf:id:dozensdozy:20180623013818p:plain<目次>

これまで進んだこと

 1. 3Dスキャンデータ(ポリゴン)とスキャナーの軌跡を描画する。

 2. スキャナーの視点とPC画面の視点を一致させる。

 3. 各撮影箇所において、スキャナーが捉えているポリゴンデータを強調表示させる。

これから進めていくこと

 4. 撮影の精度を評価する。

 5. 評価関数を探し、立体物スキャニングの機械学習をする。

<1. 軌跡の描画>

スキャンデータは毎フレーム4x4の行列として保存される。

そこから、回転を表す3x3行列と、座標の3次元ベクトルを取り出し、スキャナーの軌跡を描画した。

<2. スキャナーとPCの視点の同一化>

つまり、

cam.SetPosition(スキャナーの視点方向の3次元ベクトル);

また、各スキャンデータは連番となっているので、キーボード操作で前後の視点に移動できるようにした。

「何番目のデータからの視点か」は、変数 viewpointer を作成して識別させた。

<3. 強調表示>

カメラが各フレームで捉えているメッシュのみ、赤色で強調表示させた。

変数 viewmesh は、強調表示をするか否か、つまり ON/OFF スイッチの機能を果たす。

  • スイッチとして、例えばキーボードの特定のキーを割り当てる。

  • ON のときは、該当メッシュが赤くなる。

  • ON の状態で、視点を前後に移動させると、強調されるメッシュも前後に変わる。

f:id:dozensdozy:20180623013811p:plainf:id:dozensdozy:20180623013814p:plainf:id:dozensdozy:20180623013818p:plain
視点の強調表示:メッシュが重なっている部分が隠れてしまっている

【描画に関する部分】

void ofApp::draw(){
    ofSetBackgroundColor(ofColor::black);
    
    cam.begin();
    ofEnableLighting();
    for (int i = 0; i < num; i++){
        ofPushMatrix(); 
        light.enable();
        ofMultMatrix(mat[i]);
        ofMaterial material;
        if(viewpointer == i and viewmesh == -1){
            material.setDiffuseColor(ofColor::red); //
        }else{
            material.setDiffuseColor(ofColor::white);
        }
        
        material.begin();
        meshes[i][0].draw();
        material.end();
        
        light.disable();
        ofPopMatrix();
        
    }

【キーボード操作の部分】

OpenFrameworksではとても簡単にキーボード操作が書けてしまう。

void ofApp::keyPressed(int key){
    if(key == OF_KEY_UP){ //上矢印キーが押されたら
        if(viewpointer < num){
            viewpointer++; //カメラの位置++
            cam.setPosition(mat[viewpointer].getTranslation());
            cam.setOrientation(mat[viewpointer].getRotate());
        }
    }
    if(key == OF_KEY_DOWN){ //下矢印キーが押されたら
        if(viewpointer > 0){
            viewpointer -- ; //カメラの位置++
            cam.setPosition(mat[viewpointer].getTranslation());
            cam.setOrientation(mat[viewpointer].getRotate());
        }
    }
    if(key == 'p'){
        viewmesh = viewmesh*(-1); // p キーを押すことでON/OFFを切り替えられる
    }
    
}

論文要約その1

A Surface-Based Next-Best-View Approach for Automated 3D Model Completion of Unknown Objects

2011 IEEE International Conference on Robotics and Automationの論文を、備忘録を兼ねて簡単に要約。

>> https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5979947

 

Abstract

  • NBVは、3Dモデルの自動生成にとって重要な側面である。
  • リアルタイムデータ分析から三角形のポリゴンを作成し、人間の直感のように視点を決定するsurface-basedNBVを提案する。
  • 物体の表面の境界を判別し、2次(平面)的な区画が推定される。
  • 表面に垂直で、それまでに取得したデータと重なる部分を観測するための視点候補を計算できる。
  • NBVが、全ての表面を埋めることを目標として選択される。
  • この手法の目的は、未確認物体(全貌が分かっていない物体)の3Dモデルを完成させることである。
  • このNBV決定手法は、工業用ロボットとレーザー幅のスキャナーを用いてテストしたところ、とても高速であることが証明された。

 

Note:

  • real-time data stream(ing) = センサーなどからのデータ取得と、その処理、次の行動選択を同時に行うこと*1
    この分野では real-time が標準的なのだろうか?
    ロボットの動きを、物体の形に合わせて柔軟に制御するためには、real-timeの方がよいだろう。

 

  1. INTRODUCTION
    • 全体像が分かっていない物体を、柔軟にかつ自動で測定し、3Dモデルを生成できるアルゴリズムが必要である。
    • 固定されたアームではなく、二足歩行ロボットのようなものにも応用可能である必要がある。
    • この研究の目的は、形状が予め分かっていない複雑な物体を、NBVアプローチによって自動的に完全な3Dモデルを生成することである。

  2. RELATED WORK

  3. VIEWPOINT ESTIMATOR
    • まだ
  4. EXPERIMENTS
    • まだ
  5. CONCLUSIONS AND FUTURE WORK
    • View-point Estimator アルゴリズムは、対象についての事前知識は不要である。一方、衝突回避経路の計画には、対象のおおまかな形を知る必要がある。
    • NBVは、リアルタイムデータ分析によって再構築された、物体の表面の境界と、境界のそばの未測定部分の傾向を推定することによって決定される。
    • NBVの決定速度は高く、生成された3Dモデルはほぼ完全だった(測定漏れの穴がなかった)。
    • この手法では、「球」や「円柱」といった視点の制限を設ける必要がなく、複雑な物体を自動で計測可能。
    • 計測は、直線的ではなくなり、表面の傾向に適応的に沿い、未測定部分に「向かって」だけでなく境界に「沿って」行われるようになる。
    • 将来的には work cell exploration 問題と統合されるだろう。