Ubuntu20.04下VSCode配置PCL和OpenCV库-C++

Ubuntu20.04 + VSCode + Cpp + PCL + OpenCV

准备工作

代码编辑:VSCode
开发语言:C++
编译工具:Cmake G++
依赖需求:PCL / OpenCV

安装PCL库

sudo apt install libpcl-dev

配置OpenCV库

  • 安装依赖
sudo apt-get install build-essential    
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev 
sudo apt-get install python-dev python-numpy python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
  • 下载源码
    在两个网址下载source cide(zip)并解压缩
    将opencv_contrib-4.5.3 放入opencv文件里并改名为opencv_contrib

    https://github.com/opencv/opencv/releases/tag/4.5.3
    https://github.com/opencv/opencv_contrib/releases/tag/4.5.3

  • 编译源码
    进入opencv文件夹

mkdir build
cd build/
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4  -D OPENCV_EXTRA_MODULES_PATH=~/opencv-4.5.3/opencv_contrib/modules/ -D OPENCV_GENERATE_PKGCONFIG=YES -D OPENCV_ENABLE_NONFREE=True ..
解释如下
  • CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++ :
    • 指定用g++编译, 需要自己用指令查找自己的g++ 安装位置,并进行替换
  • CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc :
    • 指定用gcc编译, 需要自己用指令查找自己的gcc安装位置,并进行替换
  • BUILD_opencv_cudacodec=OFF :
    • 防止报与cuda相关的错误
  • CMAKE_BUILD_TYPE=RELEASE :
    • 表示编译发布版本
  • CMAKE_INSTALL_PREFIX :
    • 表示生成动态库的安装路径,可以自定义,考虑后续可能会安装opencv的不同版本,因此将路径变为CMAKE_INSTALL_PREFIX=/usr/local/opencv4
  • OPENCV_GENERATE_PKGCONFIG=YES :
    • 表示自动生成OpenCV的pkgconfig文件,否则需要自己手动生成
  • OPENCV_EXTRA_MODULES_PATH=/home/autom/needs/opencv-4.5.3/opencv_contrib/modules/ -D :
    • 不变为绝对路径cmake可能会报错,也可能 contrib 不能编译成功
问题1:卡在:IPPICV: Download: ippicv_2020_lnx_intel64_20191018_general.tgz

问题原因:这个包被墙了,网络不好下载不下来
解决办法:提前下载好再改路径解决

  • 下载ippicv_2020_lnx_intel64_20191018_general.tgz
    https://github.com/opencv/opencv_3rdparty/tree/ippicv/master_20191018/ippicv
  • 修改配置文件 ~/opencv-4.5.3/3rdparty/ippicv的ippicv.cmake 注意!不要用命令行打开,可能会出错 双击打开
  • 找到该列
    https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/
  • 更改为ippicv_2020_lnx_intel64_20191018_general.tgz所在的文件夹路径,例如:/home/user/
    参考网页:https://blog.csdn.net/qq_43478260/article/details/109458079
问题2:缺少boostdesc_bgm.i等文件

问题原因:未知
解决办法:下载好拷贝到目录下

  • 下载文件 https://github.com/JZhong-Li/boostdesc_bgm.i
  • 将所有文件拷贝到 opencv_contrib/modules/xfeatures2d/src/ 目录下

问题处理后重新cmake
然后查看CPU线程数

grep 'processor' /proc/cpuinfo | sort -u | wc -l  

查到是48就用 -j48

sudo make -j48
sudo make install

配置VSCode

安装VSCode

官网选择ubuntu版本直接下载安装
https://code.visualstudio.com/Download

拓展插件:C/C++ / C/C++ Extension Pack / CMake / CMake Tools / vscode-3d-preview / Include Autocomplete

新建代码结构

备注:共享文件夹内的代码不能直接链接调试,本地调试成功后再转移

文件目录如下

cpp
├── build
├── include
│   ├── func_common.h
│   ├── func_opencv.h
│   └── func_pcl.h
└── src
    ├── func_common.cpp
    ├── func_opencv.cpp
    ├── func_pcl.cpp
    └── main.cpp

include下h包含自写的函数库,src里的main.cpp是源文件,其他cpp包含了对应函数库文件具体的实现

通过VSCode调试代码(增加Cmake文件)

20230416可用

新建cmake文件

文件目录如下

cpp
├── .vscode
│   ├── c_cpp_properties.json
│   ├── launch.json
│   └── tasks.json
├── build
│   └── bin
│       ├── Linx
│       └── data
├── CMakeLists.txt
├── data 
├── include
│   ├── func_common.h
│   ├── func_opencv.h
│   └── func_pcl.h
└── src
    ├── func_common.cpp
    ├── func_opencv.cpp
    ├── func_pcl.cpp
    └── main.cpp

需要的文件内容如下

1. CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(Linx)

# ========================================
# === 构建静态库以加速
# ========================================
set(COMMON_SOURCES src/func_common.cpp src/func_pcl.cpp src/func_opencv.cpp)

add_library(Func STATIC ${COMMON_SOURCES})

if(UNIX)
  target_link_libraries(Func pthread)
endif()

# ========================================
# === PCL库
# ========================================
find_package(PCL 1.8 REQUIRED)
    include_directories(${PCL_INCLUDE_DIRS})
    link_directories(${PCL_LIBRARY_DIRS})
    add_definitions(${PCL_DEFINITIONS})

# ========================================
# === OpenCV库
# ========================================
set(OpenCV_DIR "/home/acedia/libs/opencv-4.5.3/build/")
find_package(OpenCV REQUIRED)
if (NOT OpenCV_FOUND)
    message(FATAL_ERROR "OpenCV library not found")
else()
    include_directories(${OpenCV_INCLUDE_DIRS})
    include_directories(${OpenCV2_INCLUDE_DIRS})
    link_directories(${OpenCV_LIB_DIR})

endif()

    
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build/bin)

aux_source_directory(./src/ DIR_SRCS)

add_executable(Linx  ${DIR_SRCS})

set_target_properties(Linx PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)

target_link_libraries(Linx
${ABSOLUTE_TARGET_LIB} ${PCL_LIBRARIES} libpthread.so  ${OpenCV_LIBS} Func ${CLOUD_VIEWER} 
)
2. .vscode/c_cpp_properties.json
{
  "configurations": [
      {
          "name": "Linux",
          "includePath": [
              "${workspaceFolder}/**",
              "/usr/include",
              "/usr/include/**",
              "/usr/include/x86_64-linux-gnu/sys",
              // 检查pcl路径
              "/usr/include/pcl-1.10",
              "/usr/include/eigen3",
              "/usr/include/eigen3/Eigen/", 
              "/usr/include/vtk-7.1",   
              "/usr/include/qhull",
              "/usr/include/flann",
              "/usr/include/boost",
              // 检查opencv路径
              "/usr/local/opencv4/include/opencv4"
          ],
          "defines": [],
          "compilerPath": "/usr/bin/gcc",
          "cStandard": "${default}",
          "cppStandard": "${default}",
          "intelliSenseMode": "linux-gcc-x64"
      }
  ],
  "version": 4
  }
3. .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++ - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/bin/Linx",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "Build",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}
4. .vscode/tasks.json
{   
    "version": "2.0.0",
    "options": {
        "cwd": "${workspaceFolder}/build"
    },
    "tasks": [
        {
            "type": "shell",
            "label": "cmake",
            "command": "cmake",
            "args": [
                ".."
            ]
        },
        {
            "label": "make",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "command": "make",
            "args": [

            ]
        },
        {
            "label": "Build",
            "dependsOrder": "sequence", // 按列出的顺序执行任务依赖项
            "dependsOn":[
                "cmake",
                "make"
            ]
        }
    ]
}
通过VSCode调试代码(修改.vscode文件夹)

20230416更新:建议使用Cmake版本调试PCL和Opencv一起运行的代码
备注:文件的相对位置问题,如果运行main.out文件则需要与其同目录,但是直接 F5 要放在main.cpp目录
多文件调试设置,执行: ctrl + shift + p : 选择配置任务自动生成tasks.json文件
全选更改内容如下

{
"tasks": [
    {
        "type": "cppbuild",
        "label": "C/C++: g++ 生成活动文件",
        "command": "/usr/bin/g++",
        "args": [
            "-fdiagnostics-color=always",
            "-g",
            "${file}",
            "${fileDirname}/func_common.cpp", 
            "${fileDirname}/func_pcl.cpp",
            "${fileDirname}/func_opencv.cpp",  
            "-o",
            "${workspaceFolder}/build/${fileBasenameNoExtension}"
        ],
        "options": {
            "cwd": "${fileDirname}"
        },
        "problemMatcher": [
            "$gcc"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        },
        "detail": "调试器生成的任务。"
    }
],
"version": "2.0.0"
}

主要更改部分为选择的cpp以及生成可执行文件的位置

"-g",
"${file}",
"${fileDirname}/func_pcl.cpp",
"${fileDirname}/func_common.cpp",
"-o",
"${workspaceFolder}/build/${fileBasenameNoExtension}"
        
添加PCL和OpenCV等第三方库

执行: ctrl + shift + p : 选择编辑配置自动生成c_cpp_properties.json文件

在c_cpp_properties.json中加入pcl和opnecv库的路径
主要是给intelliSense看的,避免写代码时划红线报错

{
"configurations": [
    {
        "name": "Linux",
        "includePath": [
            "${workspaceFolder}/**",
            // 检查opencv路径
            "/usr/local/opencv4/include/opencv4",
            // 检查pcl路径
            "/usr/include/pcl-1.10",
            "/usr/include/eigen3",
            "/usr/include/vtk-7.1"
        ],
        "defines": [],
        "compilerPath": "/usr/bin/gcc",
        "cStandard": "c17",
        "cppStandard": "gnu++14",
        "intelliSenseMode": "linux-gcc-x64"
    }
],
"version": 4
}
备注VSCode里文件变量含义

${workspaceRoot}

  • 当前的文件夹的绝对路径+打开文件夹的名字
  • ~/cpp/src

${workspaceFolder}

  • 打开文件夹的绝对路径
  • ~/cpp

${file}

  • 当前打开正在编辑的文件名,包括绝对路径,文件名,文件后缀名
  • ~/cpp/src/main.cpp

${relativeFile}

  • 从当前打开的文件夹到当前打开的文件的路径
  • src/main.cpp

${fileBasename}

  • 当前打开的文件名+后缀名,不包括路径
  • main.cpp

${fileBasenameNoExtension}

  • 当前打开的文件的文件名,不包括路径和后缀名
  • main

${fileDirname}

  • 当前打开的文件所在的绝对路径,不包括文件名
  • ~/cpp/src

${fileExtname}

  • 当前打开的文件的文件名,不包括路径和后缀名
  • main

${cwd}

  • 打开的文件夹
  • cpp
在tasks.json中加入第三方库的路径

注意:与依赖Cmake不同,这种方式需要链接其他库,秘诀是通过报错增加链接.so文件
执行时的依赖(20230328可用

{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",   
"tasks":[  // 可以有多个参数
    {
        "type": "cppbuild",
        "label": "C/C++: g++ 生成活动文件",
        "command": "/usr/bin/g++",
        "args":[
            "-g",
            "${file}",
            "${fileDirname}/func_common.cpp", 
            "${fileDirname}/func_pcl.cpp",
            "${fileDirname}/func_opencv.cpp",   
            // include path指令
            "-I", "/usr/local/opencv4/include/opencv4",
            "-I", "/usr/local/opencv4/include/opencv4/opencv2",  
            "-I", "/usr/local/include",
            "-I", "/usr/include/pcl-1.10",
            "-I", "/usr/include/eigen3",
            "-I", "/usr/include/vtk-7.1",
            // "-I", "/usr/include/qhull",
            // "-I", "/usr/include/flann",
            // "-I", "/usr/include/boost",
            // lib 库文件地址
            "-L", "/usr/lib/x86_64-linux-gnu", 
            // 基本库    
            "-l", "pcl_io",  
            "-l", "pcl_common",    
            // 点云可视化                     
            "-l", "pcl_visualization",
            "-l", "vtkCommonCore-7.1",
            "-l", "vtkCommonMath-7.1",
            "-l", "vtkRenderingCore-7.1",
            "-l", "vtkCommonDataModel-7.1", 
            // 点云滤波
            "-l", "pcl_filters",
            // 点云欧式聚类 
            "-l", "pcl_search",
            "-l", "pcl_segmentation",
            // 点云区域生长
            "-l", "pcl_features",
			// "-l", "pcl_kdtree",
			// "-l", "pcl_surface",
			// "-l", "pcl_tracking",
            // "-l", "boost_system",  
            "-o",                               
            // 生成指定名称的可执行文件
            "${workspaceFolder}/build/${fileBasenameNoExtension}.out"  
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    },
    {
        "label": "cmakebuild",      
        "type": "shell", 
        "command": "cd build && cmake ../ && make",  
        "args": []
    }
] 
}
调试离群点移除时报错如下
error:flann_algorithm_t’ was not declared in this scope

取消调用OpenCV库后正常使用,验证是OpenCV库和flann冲突导致
解决办法:20230413更新,如果只使用PCL的flann库,可以通过修改OpenCV库中的flann文件夹名避免:
执行如下两步,进入路径,更改名称,解决!

cd /usr/local/opencv4/include/opencv4/opencv2
sudo mv flann/ flann2/

20230413更新,治标不治本,需要使用opencv的flann库时也不能正常调用,除非把所有涉及opencv/flann换成opencv/flann2,需要重新思考解决方案

考虑通过cmake版调试解决该问题

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值