深度图像显示在qvtkwidget上面

版权声明:本文为博主原创文章,未经博主允许不得转载。 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源码,调用的函数。

一步步推导的过程:

大致的工程:(简单粗暴了些)

不过还有很多其他的方法,简单的。欢迎留言

猜你喜欢

转载自blog.csdn.net/qq_38446366/article/details/82142121
今日推荐