linux 安装opencv_在Linux下用正确的姿势安装OpenCV

2023-05-16

时隔多年,居然又要在Linux下编译OpenCV,然而这次居然折腾了一晚上,没想到会出现那么多问题。索性写个文章记录一下,防止下一次又碰壁。

我是在虚拟机上跑的ubuntu18.04。

配置如下:

第一步 :下载依赖文件,这一步非常重要,如果是缺少某个依赖文件,编译过程也不会出错,但是在使用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 libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install ffmpeg

第二步:从GitHub下载opencv和opencv_contrib源码,如果你是刚刚安装Linux,那么最好就是修改源,不然下载会非常非常慢。具体操作请移步百度: 如何修改Linux源。

我这里用的都是4.2.0的版本。

OpenCV和contirb的源码下载路径:

https://github.com/opencv/opencv/releases​github.com https://github.com/opencv/opencv_contrib/releases​github.com

然而在下载过程中可能会出现下载不完全的情况(起码我是这样的),往往出现的问题是缺少boostdesc_bgm.i等问题。所以我们需要提前下载好这些文件,以防不时之需。文件我已经集合在了我的GitHub里面。

GitHub地址(欢迎大佬给小星星):

https://github.com/omega-Lee/OpenCV-boostdesc-vgg-​github.com

下载完以后应该是这样子的:

第三步:通过命令解压opencv和opencv_contirb:

tar -zxvf opencv-4.2.0.tar.gz
tar -zxvf opencv_contirb-4.2.0.tar.gz

然后可以得到这样的两个文件夹:

第四步:通过命令把contrib文件移动到opencv文件夹里面:

sudo cp -r opencv_contrib-4.2.0 opencv-4.2.0

打开opencv里面应该是长这个样子的:

通过命令,在opencv文件夹里面新建一个文件夹bulid,然后进入这个文件夹。

sudo mkdir build
cd bulid

第五步:使用命令生成makefile文件

这里的命令不要原封不动的粘贴复制,要根据自己的路径进行修改,比如我的opencv文件夹是在/home/omega-lee/下,就可以像下面那样写。这个过程大概需要几十秒就可以完成。

命令:

sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/omega-lee/opencv-4.2.0/opencv_contrib-4.2.0/modules/ ..

第六步:进行make编译

我的虚拟机是4核的所以是j4,这个根据自己的机子进行选择,多核心编译能加快速度。大概需要30多分钟吧。

sudo make -j4

在进行make的时候,大概到78%左右就会出现错误,提示你缺少.i文件。这个时候打开之前下载好的.i文件夹,通过命令移植到缺失目录下。

sudo cp * ../opencv_4.2.0/opencv_contrib-4.2.0/modules/xfeatures2d/src/

移植完以后应该长这个样子:

然后继续执行编译命令:sudo make -j4

继续等待,然后在大概95%的时候继续报错(@_@;),这个时候系统提醒你缺少某hpp文件,不要担心,这个文件不需要下载,直接可以在opencv文件夹中找到。

通过命令打开opencv_contrib文件:

cd ./opencv-4.2.0/opencv_contrib-4.2.0/modules/xfeatures2d/test

你会发现你并没有features2d文件夹,这个文件夹在/opencv-4.2.0/modules里面。

使用命令移动这个文件夹到缺失目录下:

sudo cp -r opencv-4.2.0/modules/features2d opencv-4.2.0/opencv_contrib-4.2.0/modules/xfeatures2d/test

这下子基本问题全部解决了,继续执行make -j4命令编译。然后就可以看到100%编译完成。

接着就是安装,使用命令进行安装:

sudo make install

第七步:配置路径,执行下面命令配置环境变量,注意如果你当前使用的是fish shell,或者别的shell,请退出到bash,不然配置会出问题。

sudo vim/etc/ld.so.conf.d/opencv.conf

这个时候你可能打开文件可能是空白的,没有关系,在文件末尾添加保存并退出

/usr/local/lib

执行生效命令:

sudo ldconfig

继续打开:

sudo vim /etc/bash.bashrc

在文件末尾添加写入:

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

保存退出。

执行更新命令:

source /etc/bash.bashrc
sudo updatedb

整个时候就完成了整个opencv的编译配置。完结散花✧(≖ ◡ ≖✿)

第八步,测试opencv

opencv内部集成了很多测试demo,可以通过执行这些demo看是否完成opencv的配置。

通过命令进入到demo中:

cd opencv-4.2.0/samples/cpp/example_cmake

因为虚拟机可能使用不了摄像头的原因,我们就稍微的修改一下代码,让程序显示一张图片就好了。

sudo vim example.cpp

修改保存后退出进行编译操作。

sudo mkdir bulid
cd bulid
sudo cmake ..
sudo make

编译完以会得到一个可执行文件,执行后就可以看见图片了。

好了,以上全部是在Linux下安装并编译opencv的全部过程,虽然坑有点多,但是多操作几次就习惯了。如果在测试的时候还是没办法使用opencv,请认真比对我给出的过程。

感谢大家观看!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux 安装opencv_在Linux下用正确的姿势安装OpenCV 的相关文章

  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • BRISK 特征检测器检测零个关键点

    下面显示的 Brisk 探测器没有给我任何关键点 有人可以提出一个问题吗 我将尝试用一些代码解释我在下面所做的事情 include opencv2 features2d features2d hpp using namespace cv u
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • opencv水印周围的轮廓

    我想在图像中的水印周围画一个框 我已经提取了水印并找到了轮廓 但是 不会在水印周围绘制轮廓 轮廓是在我的整个图像上绘制的 请帮我提供正确的代码 轮廓坐标的输出为 array 0 0 0 634 450 634 450 0 dtype int
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • 如何查询X11显示分辨率?

    这似乎是一个简单的问题 但我找不到答案 如何查询 通过 X11 存在哪些监视器及其分辨率 查看显示宏 http tronche com gui x xlib display display macros html and 屏幕宏 http
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • 如何加速 svm.predict?

    我正在编写一个滑动窗口来提取特征并将其输入到 CvSVM 的预测函数中 然而 我偶然发现 svm predict 函数相对较慢 基本上 窗口以固定的步幅长度在图像比例上滑动穿过图像 遍历图像加上提取每个图像特征的速度 窗口大约需要 1000
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • 使用 plistBuddy 获取值数组

    var keychain access groups declare a val usr libexec PlistBuddy c Print var sample plist echo val echo val 0 Ouput Array
  • Awk - 计算两个文件之间的每个唯一值和匹配值

    我有两个文件 首先 我尝试获取第 4 列中每个唯一字段的计数 然后匹配第二个文件的第二列中的唯一字段值 File1 第 4 列的每个唯一值和 File2 第 2 列包含我需要在两个文件之间匹配的值 所以本质上 我试图 gt 如果 file2
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐