版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38446366/article/details/82142121
由于工作需要,想将深度图像rangeImageVisualizer的图像显示在qvtkwidget上面
耗时好几个星期,终于懂了:
angular_resolution_x = pcl::deg2rad (angular_resolution_x);
angular_resolution_y = pcl::deg2rad (angular_resolution_y);
pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>& point_cloud = *point_cloud_ptr;
Eigen::Affine3f scene_sensor_pose (Eigen::Affine3f::Identity ()); //申明传感器的位置是一个4*4的仿射变换
for (float x=-0.5f; x<=0.5f; x+=0.01f)
{
for (float y=-0.5f; y<=0.5f; y+=0.01f)
{
PointType point; point.x = x; point.y = y; point.z = 2.0f - y;
point_cloud.points.push_back (point);
}
}
point_cloud.width = (int) point_cloud.points.size (); point_cloud.height = 1;
float noise_level = 0.0;
float min_range = 0.0f;
int border_size = 1;
range_image_ptr.reset(new pcl::RangeImage);
range_image = *range_image_ptr;
range_image.createFromPointCloud (point_cloud, angular_resolution_x, angular_resolution_y,pcl::deg2rad (360.0f), pcl::deg2rad (180.0f),scene_sensor_pose, coordinate_frame, noise_level, min_range, border_size);
qDebug()<<"init end";
// pcl::visualization::RangeImageVisualizer range("rangeimgae");
// range.showRangeImage(range_image);
// while(this->isActiveWindow())
// {
// range.spinOnce ();
// pcl_sleep (0.01);
// }
float* float_image = range_image.getRangesArray ();
unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage (float_image, range_image.width, range_image.height);
void* data = const_cast<void*> (reinterpret_cast<const void*> (rgb_image));
vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New ();
// vtkSmartPointer<vtkInformation> info = vtkSmartPointer<vtkInformation>::New();
// image->AllocateScalars(info);//很重要
// image->SetNumberOfScalarComponents(1, info);//每个像素需要表示的组份 =1是指标量图
image->SetExtent (0, range_image.width - 1, 0, range_image.height - 1, 0, 0);
image->AllocateScalars (VTK_UNSIGNED_CHAR, 3);
image->GetPointData ()->GetScalars ()->SetVoidArray (data, 3 * range_image.width * range_image.height, 1);
// vtkSmartPointer<vtkImageFlip> algo_ =vtkSmartPointer<vtkImageFlip>::New ();
// algo_->SetInterpolationModeToCubic ();
// algo_->PreserveImageExtentOn ();
// algo_->FlipAboutOriginOn ();
// algo_->SetFilteredAxis (1);
// algo_->SetInputData (image);
// algo_->Update ();
// qDebug()<<"**********************************5";
// vtkSmartPointer<vtkImageSlice> slice_ = vtkSmartPointer<vtkImageSlice>::New ();
// vtkSmartPointer<vtkImageData> empty_image = vtkSmartPointer<vtkImageData>::New ();
// vtkSmartPointer<vtkImageSliceMapper> map = vtkSmartPointer<vtkImageSliceMapper>::New ();
// map->SetInputData (empty_image);
// slice_->SetMapper (map);
// slice_->GetMapper()->SetInputConnection (algo_->GetOutputPort ());
// qDebug()<<"**********************************6";
vtkSmartPointer<vtkImageActor> actor = vtkSmartPointer<vtkImageActor>::New();
actor->SetInputData(image);
vtkSmartPointer<vtkRenderer> ren_ = vtkSmartPointer<vtkRenderer>::New();
// ren_->AddViewProp (slice_);
ren_->AddActor(actor);
ren_->ResetCamera();
ren_->SetBackground(1,1,1);//---------
ui->qvtkWidget->GetRenderWindow()->AddRenderer(ren_);
ui->qvtkWidget->GetRenderWindow()->Render();
即可显示。
根据rangImageVisual showRangeImage源码,调用的函数。
一步步推导的过程:
大致的工程:(简单粗暴了些)
不过还有很多其他的方法,简单的。欢迎留言