PCL 1.11 缺少 files/directories 错误消息

Missing files/directories error message with PCL 1.11

我正在尝试使用立体相机排列(校准和校正)、视差图和点云库来创建点云。下面是我的 C++ 代码的简要说明,该代码应该使用视差图生成点云。

#include <iostream>
#include <fstream>
#include <string>
#include <opencv2/opencv.hpp>
#include <opencv2/ximgproc.hpp>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/vtk.h>

using namespace std;
using namespace cv;
using namespace cv::ximgproc;
using namespace pcl;
using namespace pcl::visualization;

boost::shared_ptr<PCLVisualizer> rgbVis (PointCloud<PointXYZRGB>::ConstPtr cloud)
{
  boost::shared_ptr<PCLVisualizer> viewer (new PCLVisualizer ("3D Viewer"));
  viewer->setBackgroundColor (0, 0, 0);
  PointCloudColorHandlerRGBField<PointXYZRGB> rgb(cloud);
  viewer->addPointCloud<PointXYZRGB> (cloud, rgb, "sample cloud");
  viewer->setPointCloudRenderingProperties (PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
  return (viewer);
}

/* Some other functions */

int main()
{
    .....
    .....
    int l, r;
    cout << "Enter CAM index for Left Camera ";
    cin >> l;
    cout << endl << "Enter CAM index for Right Camera ";
    cin >> r;
    VideoCapture leftCam(l);
    VideoCapture rightCam(r);
    ........
    ........
    boost::shared_ptr<PCLVisualizer> viewer;

    bool proceed = true;
    
    while(proceed)
    {
        ........
        ........
        PointCloud<PointXYZRGB>::Ptr pointCloud(new PointCloud<PointXYZRGB>());
        Mat xyz;
        reprojectImageTo3D(disparityMap, xyz, q);
        pointCloud->width = static_cast<uint32_t>(disparityMap.cols);
        pointCloud->height = static_cast<uint32_t>(disparityMap.rows);
        pointCloud->is_dense = false;
        PointXYZRGB tempPoint;
        for(int i = 0; i < disparityMap.rows; i++)
        {
            uchar* rgb_ptr = rightUndistorted.ptr<uchar>(i);
            uchar* disp_ptr = disparityMap.ptr<uchar>(i);
            double* xyz_ptr = xyz.ptr<double>(i);

            for(int j = 0; j < disparityMap.cols; j++)
            {
                uchar d = disp_ptr[j];
                if(d == 0)
                    continue;
                Point3f p = xyz.at<Point3f>(i, j);

                tempPoint.x = p.x;
                tempPoint.y = p.y;
                tempPoint.z = p.z;

                tempPoint.b = rgb_ptr[3 * j];
                tempPoint.g = rgb_ptr[3 * j + 1];
                tempPoint.r = rgb_ptr[3 * j + 2];
                pointCloud->points.push_back(tempPoint);
            }
        }

        viewer = rgbVis(pointCloud);
        if(waitKey(50) == 'q')
            proceed = false;
    }

    destroyAllWindows();
    return 0;
}

我运行下面的终端命令来编译这个.cpp文件...

g++ -std=c++14 d2pc.cpp -o d2pc `pkg-config --cflags --libs opencv pcl_io-1.11 pcl_visualization-1.11` -lboost_system

这会生成以下错误消息...

/usr/local/include/pcl-1.11/pcl/visualization/point_cloud_geometry_handlers.h:48:10: fatal error: vtkSmartPointer.h: No such file or directory
 #include <vtkSmartPointer.h>
          ^~~~~~~~~~~~~~~~~~~
compilation terminated.

我认为从 here 安装 Vtk 可能有助于解决问题,但没有帮助。

如何解决这个问题?我在 Ubuntu 18.04

中使用 OpenCV 3.4.10

首先构建并安装 vtk:

建造

  • tar xf VTK-9.0.1.tar.gz
  • cd VTK-9.0.1
  • mkdir build && cd build
  • cmake ..
  • make -j

安装

(如果您的首选安装位置与 ~/.local 不同,只需更改下面的 insdir

  • insdir=$(echo ~/.local)
  • mkdir $insdir
  • cmake --install . --prefix $insdir

然后添加包含路径 (-I $insdir/include/vtk-9.0)、库路径 (-L $insdir/lib64 或者可能 $insdir/lib 在 32 位机器上) 和 vtk 库 (-llibname1 ... -llibnameX)到你的编译命令。

示例:

  • allvtklibs=$(ls $insdir/lib64/libvtk*.so | sed -E 's,^.*/lib(.*)\.so$,-l,')
  • g++ -std=c++14 d2pc.cpp -o d2pc -I $insdir/include/vtk-9.0 -L $insdir/lib64 $(pkg-config --cflags --libs opencv pcl_io-1.11 pcl_visualization-1.11) -Wl,-rpath=$insdir/lib64 $allvtklibs -lboost_system