2013-02-14 110 views
1

我做以下,以從Kinect的深度圖像生成點雲試圖估計曲面法線:積分圖像的正常估計

pcl::PointCloud<pcl::PointXYZRGB>::Ptr create_point_cloud_ptr(Mat& depthImage, Mat& rgbImage){ 

    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>()); 
    cloud->width = depthImage.rows; //Dimensions must be initialized to use 2-D indexing 
    cloud->height = depthImage.cols; 
    cloud->resize(cloud->width*cloud->height); 

    int min_depth = INT_MAX; 
    int num_of_points_added = 0; 
    for(int v=0; v< depthImage.rows; v++){ //2-D indexing 
     for(int u=0; u< depthImage.cols; u++) { 
       Vec3b bgrPixel = rgbImage.at<Vec3b>(v, u); 
       pcl::PointXYZRGB p = pcl::PointXYZRGB(); 
       p.b = bgrPixel[0]; 
       p.g = bgrPixel[1]; 
       p.r = bgrPixel[2]; 
       p.x = u; 
       p.y = v; 
       p.z = depthImage.at<int16_t>(v,u); 
       cloud->at(u,v) = p; 
       num_of_points_added++; 
     } 
    } 
    return cloud; 
} 


int main(int argc, char* argv[]) { 
Mat cap_depth = imread("cap_depth.png",CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH); 
Mat cap_rgb = imread("cap.png",CV_LOAD_IMAGE_ANYCOLOR); 

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud = create_point_cloud_ptr(cap_depth, cap_rgb); 

pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud<pcl::Normal>); 

pcl::IntegralImageNormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne; 
ne.setNormalEstimationMethod (ne.AVERAGE_3D_GRADIENT); 
ne.setMaxDepthChangeFactor(0.02f); 
ne.setNormalSmoothingSize(10.0f); 
ne.setInputCloud(cloud); 
ne.compute(*normals); 

pcl::visualization::PCLVisualizer viewer("PCL Viewer"); 
viewer.setBackgroundColor (0.0, 0.0, 0.5); 
viewer.addPointCloudNormals<pcl::PointXYZRGB,pcl::Normal>(cloud, normals); 

而且正在以下錯誤:

[1;31m[pcl::OrganizedNeighbor::radiusSearch] Input dataset is not from a projective device! Residual (MSE) 0.053184, using 1406 valid points [0;m

我不知道如何繼續,或者什麼是從一個原始kinect深度圖像(有效)計算法線的正確方法?

+0

此錯誤意味着PCL無法估計投影矩陣;也就是說,從數據中隱含的2D-3D對應關係中,它試圖確定一個好的映射。在你的情況下,它失敗了。可能的原因:從x,y,z到u,v的映射有點不好;沒有足夠的(非NaN)數據。如果這是來自一個kinect,那麼我預計會有數十或數十萬有效點的數量,但最終只能使用1406.我建議將點雲可視化,以查看例如深度值是正確的(你使用min_depth來做什麼?)。 – 2013-02-15 07:15:51

+0

其他人也有類似的問題:http://answers.ros.org/question/54838/pcl-outlier-removal-error-with-swissranger/ – 2013-02-22 07:23:26

回答

1

對於這種情況,得到的答覆是要做到這一點:

if (depthImage.at<int16_t>(v, u) == 0) { 
     p.z = NAN; 
    } 

如果像素具有無效的深度(0在這種情況下)我們必須把它設置爲NAN用於PCL認識到這一點