Оценка нормалей интегрального изображения на основе изображения глубины kinect

Я делаю следующее, чтобы попытаться оценить нормали поверхности из облака точек, созданного из изображения глубины 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] Входной набор данных не от проекционного устройства! Остаточный (MSE) 0,053184, используя 1406 действительных точек [0; m

Я не уверен, что делать дальше, или как правильно (эффективно) вычислить нормали из необработанного изображения глубины Kinect?


person Aly    schedule 14.02.2013    source источник
comment
Эта ошибка означает, что PCL не смог оценить матрицу проекции; то есть, исходя из неявных 2D-3D-соответствий в ваших данных, он пытается определить хорошее отображение. В вашем случае это не удалось. Возможные причины: отображение из x, y, z в u, v как-то плохо; недостаточно данных (не NaN). Если это от kinect, то я ожидаю, что там будет что-то порядка десятков или сотен тысяч действительных точек, но в итоге вы получите только 1406. Я предлагаю визуализировать ваше облако точек, чтобы увидеть, например, значения глубины верны (для чего вы используете min_depth?).   -  person D.J.Duff    schedule 15.02.2013
comment
У кого-то еще есть аналогичная проблема: answers.ros .org / question / 54838 /   -  person D.J.Duff    schedule 22.02.2013


Ответы (1)


В этом случае ответ был следующим:

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

Если пиксель имеет недопустимую глубину (в данном случае 0), мы должны установить его в NAN, чтобы pcl распознал это

person Aly    schedule 22.02.2013