2016-04-21 833 views
2


PPF 3D模型匹配OpenCV的C++

我開發一個應用程序:

  1. 7個讀取模型文件和火車一PPF 3D檢測;
  2. 讀取場景文件並嘗試與探測器匹配;
  3. 將結果存儲在文件中(可視化檢索)。

我是繼OpenCV tutorial,但也有我不理解甚至是閱讀documentation幾件事情:

  1. detector.match()商店上結果姿勢在現場模型。但據我瞭解,構成是模型的位置和方向,但我怎麼知道哪個模型是?
  2. 當我打印第一個結果的姿勢時,它給了我一個4x4的表格,其上有浮點值。我在哪裏可以找到他們的意思?
  3. 仍然在姿勢打印,它給了我模型索引這首先,我認爲這是我用來訓練探測器的模型的數量。問題是:我用7個模型來訓練探測器,第一個結果給我「Pose to Model Index 12」。所以我認爲這是模型描述索引,因爲它在 Drost(2012)。但如果它真的是模型描述索引,我怎麼知道這個索引屬於哪個模型?
  4. 根據教程,使用transformPCPose並將其寫入PLY文件將給出匹配的視覺結果,但 documentation表示它返回一個4x4姿態矩陣,但我仍在打印它,它會給我一個奇怪的圖像超過16個頂點,所以我不明白教程在做什麼。我如何將可視化結果寫入像教程那樣的文件?

我也讀過ICP用來糾正任何姿勢錯誤,但是使用沒有ICP的PPF會給出可接受的結果。無論如何,我試圖使用ICP,但它總是給我「錯誤的參數錯誤」。

我使用的代碼波紋管寫着:

void computer_vision_3d(string in_path) 
{ 
    Mat files_clouds[NUM_OF_FILES];         // > Stores the point cloud of all objects 
    Mat scene_cloud;            // > Stores the scene point cloud 
    ppf_match_3d::PPF3DDetector 
     detector(RELATIVE_SAMPLING_STEP, RELATIVE_DISTANCE_STEP); // > Matches the model with the scene 
    vector<Pose3DPtr> results;          // > Stores the results of the processing 

     // ! Phase 1 - Train Model 
    scene_cloud = loadPLYSimple(DEFAULT_SCENE_PATH.c_str(), PARAM_NORMALS); 
    for(int i = 0; i < NUM_OF_FILES; i++) 
    { 
      // . Init Point Cloud 
     string file_path = DEFAULT_OBJECT_PATH + to_string(i) + ".ply"; 
     files_clouds[i] = loadPLYSimple(file_path.c_str(), PARAM_NORMALS); 

      // . Train Model 
     detector.trainModel(files_clouds[i]); 
    } 

     // ! Phase 2 - Detect from scene 
    detector.match(scene_cloud, results, 
       RELATIVE_SCENE_SAMPLE_STEP, RELATIVE_SCENE_DISTANCE); 

     // ! Phase 3 - Results 
    if(results.size() > 0) 
    { 
     Pose3DPtr result = results[0]; 
     result->printPose(); 

      // ! Transforms the point cloud to the model pose 
     for(int i = 0; i < NUM_OF_FILES; i++) 
     { 
      Mat pct = transformPCPose(files_clouds[i], result->pose); 
      string f_name = "match" + to_string(i) + ".ply"; 
      writePLY(pct, f_name.c_str()); 
     } 
    } 

} 

其中一個模型,場景和結果:

Figure 1 One of the seven models
圖1 - 一個七個模型。


Figure 2 The scene
圖2場景。


Figure 3 The weird result
圖3 - 奇怪的結果。


回答

3

由於該模塊的作者,我想解決您的問題:

1. detector.match()在結果上的場景模型的姿態商店。但據我瞭解,姿勢是模型的位置和方向,但我怎麼知道哪個模型是?

只有一個模型。所以姿勢是針對同一模型的不同假設

2.當我打印第一個結果的姿勢時,它會給我一個4x4的表格,其中包含浮點值。我在哪裏可以找到他們的意思?

它是[R | t]的增廣矩陣與[0,0,0,1]的額外行進行均勻化。

3.仍然在姿勢打印,它給了我模型索引,起初,我認爲這是我用來訓練檢測器的模型的數量。問題是:我使用了7個模型來訓練探測器,第一個結果給了我「姿勢指數12」。所以我認爲這是模型描述索引,因爲它是Drost(2012)。但如果它真的是模型描述索引,我怎麼知道這個索引屬於哪個模型?

它是匹配模型點(對應關係)的ID而不是模型ID。正如我所說,不支持多種型號。

3.根據教程,使用transformPCPose並將其寫入PLY文件將給出匹配的可視化結果,但文檔說它返回4x4姿態矩陣,但我仍在打印它並且它給我一個超過16個頂點的怪異圖像,所以我不明白教程在做什麼。我如何將可視化結果寫入像教程那樣的文件?

函數用給定姿勢轉換點雲。如果姿勢正確,它只會給出正確的結果。我不認爲你的實施結果是正確的。 ICP中的「不良說法」例外也可能是因爲這個原因。

還有一點需要注意:始終確保模型和場景具有正確朝向相機的表面法線。

+0

謝謝!當我問到這個問題時,我對計算機視覺瞭解不多,現在我明白了一點,我發現我做了很多錯誤的事情...... –

+0

您可以擴展「正確面向相機」 ?我發現在計算法線之前(在計算法線的示例代碼中),您設置了視點,但表面法線如何與相機視點相關? – xmp125a

+0

好問題。檢查'理論入門'部分的末尾: http://pointclouds.org/documentation/tutorials/normal_estimation.php –