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版调试解决该问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云运营安全概述,云运营安全的方案措施有哪些?

精品推荐-2024最新企业网络安全运营方案资料合集(29份).zip 【推荐】最新网络安全运营方案和实践合集(共80多份).zip 云运营安全是指在云环境中进行运营活动时,确保数据和系统的安全性。这涉及到多个方面&#xff0c…

程序汪若依微服务华为云Linux部署保姆教程

若依官方有3个版本,程序汪以前已经出了对应的安装部署视频教程 单应用版本 前后分离版本 微服务版本 本视频是若依微服务版本,如果基础的环境软件都不会安装建议看下程序汪的单应用和前后端分离版本教程, 欢迎点击进入 (单应…

Flask蓝图找不到路由地址,访问404

Flask蓝图找不到路由地址,访问404 问题描述: 使用flask的蓝图对不同的模块设置路由地址时,接口是放到不同的python文件里的,当编写完一个蓝图的接口,进行访问请求的时候,出现了404无法访问的情况。 一、检查…

SQLite3 数据库的基本操作

SQLite3 是一种轻量级的关系型数据库管理系统,常用于移动设备和小型应用程序中。下面是一些使用 SQLite3 数据库的基本操作: 连接到数据库:使用命令 0 来连接到一个 SQLite3 数据库文件,如果该文件不存在则会创建一个新的数据库文…

【Python】python+requests+excel+pytest-实现接口自动化实例

目录 测试需求实现思路完整框架2.1 初始化数据 (test_data.xlsx)2.2 核心脚本 (api_client.py)2.3 测试用例 (test_interfaces.py)2.4 日志 (logging)2.5 pytest配置文件 (pytest.ini)2.6 测试报告 (pytest-html)2.7 入口函数 (run_tests.py)2.8 完整流程注意事项测试需求 简单…

Dalle-3、Sora、Stable Diffusion 3 掀起AIGC新浪潮

随着科技的飞速发展,我们迎来了视觉AIGC高光时刻,一个充满无限可能与机遇的新时代。在这个时代里,三大里程碑Dalle-3、Sora和Stable Diffusion 3以其炸裂式的技术发展,引领着AIGC领域的新浪潮。文章首先做相应简要介绍&#xff0c…

【LeetCode-300.最长递增子序列】

题目详情: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的…

字符驱动程序-LCD驱动开发

一、驱动程序的框架 总共分为五步: 1、自己设定或者系统分配一个主设备号 2、创建一个file_operations结构体 这个结构体中有操作硬件的函数,比如drv_open、drv_read 3、写一个注册设备驱动函数 需要register_chrdev(major,name,结构体)&#xff0…

kingbaseESV8逻辑备份还原

数据库逻辑备份还原 sys_dump -h127.0.0.1 -Usystem -f/home/kingbase/db01.dmp db01 ksql -h127.0.0.1 test system -c drop database db01 ksql -h127.0.0.1 test system -c create database db01 ksql -h127.0.0.1 -Usystem -ddb01 -f/home/kingbase/db01.dmp --------…

各种需要使用的方法-->vue/微信小程序/layui

各种需要使用的方法-->vue/微信小程序/layui 1、vue里样式不起作用的方法,可以通过deep穿透的方式2、 js获取本周、上周、本月、上月日期3、ArrayBuffer Blob 格式转换ArrayBuffer与Blob的区别ArrayBuffer转BlobBlob转ArrayBuffer需要借助fileReader对象 4、使用…

2015年认证杯SPSSPRO杯数学建模D题(第一阶段)城市公共自行车全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 D题 城市公共自行车 原题再现: 城市交通问题直接影响市民的生活和工作。在地形平坦的城市,公共自行车出行系统是一种很好的辅助手段。一般来说,公共自行车出行系统由数据中心、驻车站点、驻车桩、自行车&…

python初级第一次作业

一、 dayint(input("enter today day")) fdayint(input("enter num of day since today")) c((fday%7)day)%7 if c0:print("sunday") elif c1:print("monday") elif c2:print("tuesday") elif c3:print("wendnsday&quo…

openGauss + Datakit搭建openGauss运维平台

系统架构OS 硬件需求:2c4g [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# uname -m x86_64 [rootlocalhost ~]# hostname -I 192.168.92.32 下载地址:https://opengauss.org/zh/download/ 下载…

yoloV3的目标检测_3.11

目标 利用yolo模型进行目标检测的方法完成目标检测功能的实现 整个流程如下: 基于OPenCV中的DNN模块 加载已训练好的yolov3模型及其权重参数将要处理的图像转换成输入到模型中的blobs利用模型对目标进行检测遍历检测结果应用非极大值抑制绘制最终检测结果&#x…

【能源数据分析-00】能源领域数据集集锦(动态更新)

一、前言 大数据科学在能源领域的深度应用,已经深刻改变了这一行业的垂直格局。它为我们提供了宝贵的见解,帮助降低下游市场的成本,使石油生产商能够更好地应对市场繁荣期的需求。近期,石油价格的剧烈下跌给全球经济带来了沉重打…

LeetCode 2.两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 …

Kubernetes概念:服务、负载均衡和联网:2. Gateway API

Gateway API 官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/gateway/ Gateway API 通过使用可扩展的、角色导向的、 协议感知的配置机制来提供网络服务。它是一个附加组件, 包含可提供动态基础设施配置和高级流量路由的 API…

如何在CentOS 7上搭建Redis Sentinel ?

在CentOS 7上搭建Redis Sentinel包括安装Redis、配置Redis主从复制、以及设置Sentinel本身。以下是具体步骤: 1. 安装Redis 首先确保系统是最新的,然后安装Redis。如果你的CentOS 7没有自带Redis包,你可能需要先添加EPEL仓库。 sudo yum u…

[音视频学习笔记]八、FFMpeg结构体分析 -上一个项目用到的数据结构简单解析:AVFrame、AVFormatContext、AVCodecContext

前言 上次我们做了一个简单的视频解码,MediaPlay-FFmpeg - Public 这一次简单对这个代码进行一个剖析,对其中的数据结构进行一个解析。 这些数据结构之间的关系 AVFrame 、AVFormatContext 、AVCodecContext 、AVIOContext 、AVCodec 、AVStream 、AV…

CentOS7.x 上安装并配置 MySQL 8.x

如何在 CentOS 7 上安装并配置 MySQL 8.x MySQL 是最流行的开源关系型数据库管理系统之一,被广泛应用于各种网站和应用程序中。 步骤 1:下载并添加 MySQL 8.x 官方 Yum 仓库 首先,打开终端,下载 MySQL Yum 仓库的 rpm 包&#…