当前位置: 首页 > news >正文

ubuntu20.04+opencv+vscode

第一次接触C++的opencv,需要在vscode中编写cv2代码并调试。根据vscode配置C++和Opencv(ubuntu18.04)能够正确配置,是一个靠谱的教程,现在记录一下过程,方面后续参考。

1、安装依赖

在终端中安装依赖:

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 libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

2、下载源码安装

去官网下载sources源码,版本选择第二个(最新的可能存在不稳定或其他bug,选第二个可能会稳定点)

下载到本地后解压(最好不要存在中文或奇怪字符的路径),在命令行中进入opencv-version文件夹,创建并进入build文件夹mkdir build && cd build,cmake编译cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_ENABLE_NONFREE=True ..

结束后执行make指令(当然可以多线程,先nproc命令查询你的线程数,我的是20,所以使用j15指定15个线程)sudo make j15,这段等待时间较长。

完成后,指定sudo make install即可

3、环境配置

在cmake命令中设置了OPENCV_GENERATE_PKGCONFIG=ON,素以在/usr/local/lib/pdkconfig中生成了opencv4.pc文件,里面记录了opencv头文件、库文件的路径,现在配置一下(应该是环境变量一类,将其暴露给全局变量)

通过sudo vim /etc/bash.bashrc打开后在最后追加:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

保存退出后,更新source /etc/bash.bashrc

修改动态库:通过sudo vim /etc/ld.so.conf.d/opencv.conf ,在里面添加/usr/local/lib,然后保存退出,再更新一下sudo ldconfig

3、检查校验

#终端输入以下两命令,显示正常则安装成功
pkg-config --modversion opencv4 #查看版本号
pkg-config --libs opencv4 #查看libs库

除此之外,opencv源码提供了测试程序,位于opencv-version/samples/cpp/examples_cmake,在终端进入该文件夹,然后:

mkdir build
cd ./build
cmake ..
make
./opencv_example 执行该可执行文件

会弹出一个框并显示“Hello OpenCV”

注意:在cmake阶段,如果cmake文件中需要opencv,则在编译时会打印找到的opencv路径,可以以此判断是否是期望的opencv版本

4、在vscode中测试

vscode安装不说了,现在在vscode中新建一个opencvtest.cpp文件,内容为:

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc,char** argv){// 注意这里修改成你的图片路径Mat src = imread("test.jpeg",IMREAD_GRAYSCALE); //读取图片if (src.empty()) {                     //判断是否找到图片printf("没有找到图片 ");           //输出文字return -1;}else{namedWindow("input",WINDOW_AUTOSIZE);// 显示窗口命名为input ;WINDOW_AUTOSIZE显示大小为图片自定义大小,且不可以更改大小imshow("input",src); //显示waitKey(0);//显示的毫秒时间,如果函数参数<=0表示一直显示。>0表示显示的时间destroyAllWindows();return 0;}
}

c_cpp_properties.json
在.vscode文件夹的c_cpp_properties.json中,includePath下添加"/usr/local/include/opencv4"(解决检测到 #include 错误。请更新 includePath。已为此翻译单元(/home/zjgdyjy/WorkSpace/tensorrtx-master/yolov5/CutImage/opencvtest.cpp)禁用波形曲线。)

task.json
快捷键shift+ctrl+p搜索全局命令tasks,选择g++ 生成活动文件,配置内容:

// 节选
"args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}.out",// 解决opencv2/opencv.hpp: 没有那个文件或目录"`pkg-config","--libs","--cflags","opencv4`"	//这是添加第三方库代码,要添加什么库直接继续加就行,不要忘记了 ` 符号//如下面再加个 gazebo11 第三方库(你得保证你安装的第三方库中含有.pc文件)// "`pkg-config","--libs","--cflags","opencv4,gazebo11`"],

launch.json
运行——>添加配置——>C++(GDB/LLDB)——>

{"configurations": [{"name": "C/C++: cpp 生成和调试活动文件","type": "cppdbg","request": "launch","program": "${fileDirname}/${fileBasenameNoExtension}.out","args": ["`pkg-config","--libs","--cflags","opencv4`",],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "将反汇编风格设置为 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}],"preLaunchTask": "C/C++: g++ build active file",		//要和 task.json的label字段一致"miDebuggerPath": "/usr/bin/gdb",//下面这行命令可以去除Vscode中编译后出现 [1]+   Done....  的提示"miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /usr/bin/gdb -q --interpreter=mi"}],"version": "2.0.0"
}

如果想生成一个终端可以改:“externalConsole”: true ,弹出命令窗口

写在最后

有问题或者不清楚见作者原文,那写的更清楚

相关文章:

  • 基于Java (spring-boot)的社团管理系统
  • Android 自动滚动的RecyclerView,手动滑动和自动滑动无缝衔接,手动滑动时数据不重复
  • C++核心编程——内存分区、引用、函数提高和函数重载
  • 观测云产品更新 | 日志、场景仪表板、监控器等
  • python基础教程八(循环完)
  • CSS实现平行四边形
  • 记录一次git merge后发现有些文件不对的问题,排查过程
  • C++算法学习心得六.回溯算法(1)
  • 说一下mysql的锁
  • zookeeper 从是啥到咋用
  • 【图解面试】JS系列 - 如何回答数据类型相关问题(上)
  • 【hyperledger-fabric】使用couchDB
  • x-cmd pkg | grex - 用于生成正则表达的命令行工具
  • UniApp调试支付宝沙箱(安卓)
  • ssm+vue的物流配送人员车辆调度管理系统的设计与实现(有报告)。Javaee项目,ssm vue前后端分离项项目。
  • #Java异常处理
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2017 年终总结 —— 在路上
  • Angular 2 DI - IoC DI - 1
  • canvas 五子棋游戏
  • es6--symbol
  • Flex布局到底解决了什么问题
  • JAVA SE 6 GC调优笔记
  • javascript 哈希表
  • mockjs让前端开发独立于后端
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python - 闭包Closure
  • python docx文档转html页面
  • react 代码优化(一) ——事件处理
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 区块链将重新定义世界
  • 删除表内多余的重复数据
  • 通过git安装npm私有模块
  • 在Unity中实现一个简单的消息管理器
  • ​决定德拉瓦州地区版图的关键历史事件
  • #### go map 底层结构 ####
  • $L^p$ 调和函数恒为零
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (2)STM32单片机上位机
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二)hibernate配置管理
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (一一四)第九章编程练习
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)菜鸟学数据库(三)——存储过程
  • ***监测系统的构建(chkrootkit )
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 常见的偏门问题