ubuntu 22.04运行opencv4的c++程序遇到的问题

摘要:本文介绍一下在ubuntu系统中,运行一个最简单的opencv4程序都出问题的解决方法,并对其基本原理作简单阐述。解决问题的方法有很多,本文只提供其中一种。

opencv版本是4.2.0,ubuntu版本是20.04

查询opencv版本的指令是pkg-config --modversion opencv4,

复制代码
pkg-config --modversion opencv4

注意命令最后的数字4要有,否则可能会出错。提示您Package opencv was not in the pkg-config --modversion opencv,错误信息回有4行,最后一行是No package 'opencv' found。

查询ubuntu版本的指令是

复制代码
cat /proc/version

提示的信息有很多,有linux版本号,GCC,GNU以及ubuntu版本号,我们只关注ubuntu。提示信息是

20.04.1-Ubuntu SMP

在这样的编程环境下,编写C++代码,没想到会遇到很多的问题,就连编译一个最简单的程序都不可以,例如我们编译一下下面的一段代码。

源代码是官网的那个,注意,不同版本的程序要以官网为准。链接是Get Started - OpenCV

cpp 复制代码
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
int main()
{
    std::string image_path = "lambo.png";
    Mat img = imread(image_path, IMREAD_COLOR);

    imshow("Display window", img);
    int k = waitKey(0); // Wait for a keystroke in the window
    return 0;
}

如果您使用vscode编辑器直接debug,会提示您有一个错误,意思是找不到头文件。

"opencv2/core/core.hpp": No such file or directory

我们的ubuntu下安装了opencv,即使您再次安装,会发现已经安装过了,不用更新了。

复制代码
sudo apt install libopencv-dev

解决方法是在usr/include下创建一个快捷方式

cpp 复制代码
sudo ln -s /usr/include/opencv4/opencv2 /usr/include

注意,运行这些命令前,您最好到图形化的界面下,到指定的目录看看,到底有没有这些文件夹。执行完命令后,您会发现,在usr/include目录下,创建了一个opencv2的快捷方式,其实这个文件夹就是在opencv4里面,但是系统会一直在include目录下来寻找,找不到,所以就提示了错误信息,现在我们做了一个快捷方式,那么系统就能找到了,就不再提示错误信息。按照这个分析,我们在图形化界面中,创建一个快捷方式也是可以用的。

完成以上步骤后,程序还是不能运行,如果您在vscode下面debug,仍然会提示有其他的错误信息。解决这些错误的方法有很多,花生没有一一验证,这里提供一个确保可以使用的方法:

解决思路:不用vscode来debug,而用CMakeLists.txt来解决,直接在命令行cmake即可

具体执行就是在c++源文件目录下新建一个txt文件,命名为CMakeLists.txt,然后在里面填写一些规定格式的信息,这个文件有很多讲究,包括第一行就必须有版本要求。set指令是我们需要的核心指令,hello.cpp是我们源代码的名字。

cpp 复制代码
cmake_minimum_required(VERSION 3.16)
project( HELLO )
set(${OpenCV_INCLUDE_DIRS} "/usr/include/opencv4/opencv2")
set(${OpenCV_LIBS}  "/usr/lib/x86_64-linux-gnu/")
find_package(OpenCV 4.2.0 REQUIRED)


include_directories(
        ${OpenCV_INCLUDE_DIRS}
)

add_executable( hello ./hello.cpp )
target_link_libraries(hello ${OpenCV_LIBS})

在hello.cpp目录下打开terminal,然后使用cmake指令,后面跟了一个圆点,表示编译本目录。

cpp 复制代码
cmake .

cmake之后要再make一下才能生成可执行文件。

cpp 复制代码
make

要想执行这个hello可执行文件,需要指令

cpp 复制代码
./hello

执行的效果就是将一张名为lambo.png的图片显示出来。完成了这一步,您就可以在代码中扩展更多的opencv功能了。

此外,帮助文档也尽量以opencv官网文档为准,因为opencv4和opencv2的一些指令有改变,如果从网上下载一些老版本的代码,可能在您的程序中无法使用,所以要以官方文档为准,这个文档是可以切换版本的。

OpenCV: Introduction

相关推荐
码云骑士9 小时前
116-Python调用GPT-4V分析图片-Base64编码-多图-JSON结构化输出
开发语言·python·json
88号技师9 小时前
2026年SCI-分数牛顿衍生优化算法Fractional Newton-derived optimizer-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
承渊政道9 小时前
【Python编程—从入门到实践】(Python操作列表深度教程:循环、切片、元组与代码风格)
开发语言·python·pycharm·列表·元组·切片
布值倒区什么name9 小时前
Pycharm2026找不到编译器 点击运行运行不了
开发语言·python·pycharm
程与留9 小时前
08_对话框系统全解析——模态非模态、QMessageBox、QFileDialog
c++·qt
智购科技自动售货机工厂9 小时前
2026自动售货机电机驱动芯片选型:从L298N到DRV8870的工程实践~YH
大数据·开发语言·数据库·人工智能·单片机·嵌入式硬件·scikit-learn
2501_915918419 小时前
Rust 程序抓包解密,rustls 不认系统证书的几种办法
开发语言·后端·网络协议·ios·adb·https·rust
程序员的园9 小时前
赋值运算符为什么要避免自赋值?
c++
Escalating_xu9 小时前
【C++ vector 深度解析】从常用接口、扩容机制与迭代器失效到核心模拟实现
java·c++·面试
今天AI了吗9 小时前
AI 数据安全治理框架:模型能力与数据权限的边界在哪里
java·linux·开发语言·人工智能·python·深度学习·机器学习