VsCode 上的Opencv(C++)环境配置(Linux)

1.下载Opencv

1.新建文件demo_cpp,在demo_cpp中新建third_parties文件

2.OPENCV官网下载OpenCV-4.12.0

3.将下载好的opencv-4.12.0.zip压缩包在third_parties中解压,

bash 复制代码
//以下均无特殊说明,均在vscode里的TERMINAL中输入
sudo apt-get install unzip//用于解压.zip文件
cd third_parties//切换到third_parties文件中
unzip opencv-4.12.0.zip//解压opencv-4.12.0.zip到当前目录
cd opencv-4.12.0//切换到opencv-4.12.0文件中

4.在解压后的opencv-4.12.0文件中新建build文件

bash 复制代码
mkdir build//新建build文件
cd build//切换到build文件夹中

5.在TERMINAL中输入cmake

bash 复制代码
cmake ..//使用 ../CMakeLists.txt 文件作为起始点在当前目录中生成makefile

6.cmake成功执行后在terminal中输入make

7.在新建demo_cpp文件中新建CMakeLists.txt配置文件

2.配置文件调用Opencv库

编辑CMakeLists.txt配置文件

2.1 声明 CMake 版本和项目名

  • 指定本项目中cmake最低版本.查询cmake版本方法:使用快捷键(CTRL ALT T)调出终端,中输入cmake --version.
bash 复制代码
cmake_minimum_required(VERSION 3.22.1)
  • 定义项目名称并指定项目使用的编程语言,名字会被保存在一个叫 PROJECT_NAME 的 CMake 变量中
bash 复制代码
project(demo_cpp LANGUAGES CXX)

2.2定位库路径

通过set和find_package找到 OpenCV 库的位置和配置。

  • 手动设置一个名为 OpenCV_DIR 的 CMake 变量,并将其值设置为指定的路径.

./third_parties/opencv-4.12.0/build/ 是OpenCV_DIR这个变量被赋予的值。这是一个相对路径,它基于运行 cmake 命令的当前目录(通常是项目根目录),指向一个名为 third_parties 的文件夹下的 OpenCV 都build目录。这个很关键,如果没有标准安装Opencv到系统标准路径,CMake无法找到他.这个指令告诉CMake,我想要的OpenCV就在这,别去其他地方找了.

bash 复制代码
set(OpenCV_DIR ./third_parties/opencv-4.12.0/build/)
  • 查找配置文件

根据OpenCV_DIR指定的路径来寻找Opencv的配置文件(OpenCVConfig.cmake)。find_package是CMake用来寻找外部依赖包的核心指令,CMake根据OpenCV这个名字去寻找FindOpenCV.cmake或者OpenCVConfig.cmake.

REQUIRED是表示这个依赖是必须的关键字,如果CMake在任何路径上都找不到OpenCV的配置文件,会报错.如果成功找到,会定义CMake变量:OpenCV_INCLUDE_DIRS,包含了 OpenCV 所有头文件 (.hpp) 的目录路径.OpenCV_LIBS包含所有需要链接的OpenCV库文件名称列表

bash 复制代码
find_package(OpenCV REQUIRED)
  • 配置编译

通过include_directories告诉编译器去哪里找头文件。

将指定的目录添加到编译器的头文件搜索路径中,告诉编译器除了标准路径,也要到这些目录里去找头文件.${OpenCV_INCLUDE_DIRS}是变量引用语法。CMake 会将其替换为find_package(OpenCV)功后自动设置的变量值(即 OpenCV 头文件的实际路径).

如果出现报错:fatal error: opencv2/opencv.hpp: No such file or directory,请检查这个文件,他让编译器知道头文件还可以在哪.

bash 复制代码
include_directories(${OpenCV_INCLUDE_DIRS})
  • 定义执行的文件

通过add_executable声明要生成什么可执行文件,用什么源文件生成。

cpp.add_executable()用于创建可执行文件目标,main是目标名称,src/main.cpp是构建这个可执行文件依赖的源文件

bash 复制代码
add_executable(main src/main.cpp)//告诉cmake生成一个main的可执行文件,他的源代码是src/main.
  • 配置链接

通过target_link_libraries告诉链接器需要连接哪些第三方库。

**指定可执行文件在链接(Linking)阶段需要连接哪些库.target_link_libraries()**用于将库链接到指定的目标(这里是main),main是add_executable()定义的目标名称.${OpenCV_LIBS}是变量引用,可告诉链接器需要接的第三方库.

bash 复制代码
target_link_libraries(main ${OpenCV_LIBS})

运行 cmake 命令时,它就是根据这份"说明书"来生成 Makefile。随后当你运行 make 时,编译器 (g++) 和链接器 (ld) 就会根据 Makefile 中的具体指令,调用你在 CMakeLists.txt 中设置的路径和库,最终编译链接出 main 这个可执行文件。

3.使用库

在命令行中使用库

1.回到根目录下~/project/demo_cpp

2.切换到根目录下的build中,如果没有build,使用mkdir build新建一个.

3.输入cmake .. ,完成后输入make

4.选则CMake:Configure运行

4.运行可能出现的报错

main()函数

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
    auto picture1 = imread("../picture.jpeg");//读取名称为picture.jpeg的照片
    Mat graymat;
    cvtColor(picture1, graymat, COLOR_BGR2GRAY)//将picture变灰,数据存在graymat中
    imwrite("grey.jpeg", graymat);//将数据输出为图片,命名为grey.jpeg
    Mat image = imread("grey.jpeg");//读取这个图片
    if(image.empty())
    {
        printf("could not open or find picture");
        return -1;
    }
    imshow("grey.jpeg", image);//在屏幕上输出image图片


}
  • 错误1:使用imshow函数时可能会发生报错"/home/vboxuser/project/demo cpp/build/mainterminate called after throwing an instance of 'cv::Exception'what():OpenCV(4.12.0)/home/vboxuser/project/demo_cpp/third parties/opencv-4.12.0/modules/highgui/src/window.cpp:1284: error: (-2:Unspecifed error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support, If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-confg, then re-run cmake or confgure script infunction 'cvNamedWindow'"

错误表明OPenCV高阶图形界面功能未正常实现,通常是由于缺少GTK+等GUI库支持导致的.

解决办法:

第一步:在CTRL ALT T调出终端中输入

bash 复制代码
sudo apt-get install libgtk2.0-dev pkg-config
sudo apt-get install libgtk-3-dev

第二步:进入Opencv源码目录的build文件夹,输入

bash 复制代码
cmake -DWITH_GTK=ON -DWITH_GTK_2_X=ON ..
make -j$(nproc)
sudo make install
  • 错误2:/usr/bin/gcc -fdiagnostics-color=always -g /home/vboxuser/project/demo cpp/src/main.cpp -o /home/vboxuser/project/demo cpp/src/main; /home/vboxuser/project/demo cpp/src/main.cpp:1:10: fatal error: opencv2/opencv.hpp: No such file or directory

原因:运行时使用右上角的运行按钮

解决方法:

1.安装CMake插件

2.CTRL SHIFT P调出命令面板,输入CMake:Configure,鼠标点击,选则.

3.此时界面底端出现CMake Tools 插件提供的 Build、Run和debug.用这3个按钮编译\调试\运行程序,不要使用右上角的运行按钮.

注:对于 CMake 管理的项目,请你忘记所有其他的运行方式,始终只使用 VS Code 底部状态栏由 CMake Tools 插件提供的 Build、Run和 Debug按钮来编译、运行和调试你的程序,把右上角的那个运行按钮忘掉,它不适用于复杂的 CMake 项目.-----阿彦社长

4.如果依然出现报错,CTRL ALT T,在终端中输入pkg-config --cflags opencv4,查找库所在位置

再打开隐藏文件.vscode中的c_pp_properties.json,编辑includePath,将查找到的路径添加进去

再添加配置"configurationProvider": "ms-vscode.cmake-tools"

  • 错误3:点击debug时,会出现报错,WARN:0@0.049] global loadsave.cpp:275 findDecoder imread ('grey.jpeg'): can't open/read file: check file path/integrity could not open or find image[l] + Done"/usr/bin/gdb" --interpreter=mi.-tty=${DbgTerm} 0<"/tmp/Microsoft-MIEngine-In-trnvjfx.h3c" 1>"/tmp/Microsoft-MIEngine-0ut-13qxhr52.wlf"

原因:debug时,是在build下调试的,而auto picture1 = imread("picture.jpeg");是告诉CMAKE在当前目录寻找picture.jpeg文件.

解决方法:改为auto picture1 = imread("../picture.jpeg"),告诉Cmake去我当前所在路径的上一个文件中寻找picture.jpeg.或者将"../picture.jpeg"改为你存放照片的地址.

相关推荐
yw00yw5 分钟前
常见的设计模式
开发语言·javascript·设计模式
我不是星海44 分钟前
RabbitMQ基础入门实战
java·开发语言
重启的码农1 小时前
Windows虚拟显示器MttVDD源码分析 (6) 高级色彩与HDR管理
c++·windows·操作系统
jingfeng5141 小时前
C++多态
开发语言·c++
kyle~1 小时前
C/C++---浮点数与整形的转换,为什么使用sqrt函数时,要给参数加上一个极小的小数(如1e-6)
c语言·开发语言·c++
jokr_1 小时前
C++ STL 专家容器:关联式、哈希与适配器
java·c++·哈希算法
暖苏2 小时前
python-多线程(笔记)(持续更新)
大数据·开发语言·python
倔强的石头2 小时前
java程序员如何搭建C++windows开发环境搭建(二)
c++·后端
The Chosen One9853 小时前
红黑树下探玄机:C++ map&multimap 的幕后之旅
开发语言·c++
汤永红3 小时前
week5-[字符数组]查找
c++·算法·信睡奥赛