Я делаю следующее, чтобы попытаться оценить поверхностные нормали из облака точек, сгенерированного из изображения глубины 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; 31 м [pcl :: OrganizedNeighbor :: radiusSearch] Входной набор данных не от проективного устройства!
Остаточный (MSE) 0,053184, используя 1406 действительных точек
[0; м
Я не уверен, как поступить, или как правильно (эффективно) вычислить нормали из необработанного изображения глубины kinect?
Для этого случая ответ должен был сделать это:
if (depthImage.at<int16_t>(v, u) == 0) {
p.z = NAN;
}
Если пиксель имеет недопустимую глубину (в данном случае 0), мы должны установить его на NAN
для pcl, чтобы признать это
Других решений пока нет …