郁闷死了。。昨天重装Ubuntu,重写了一份巨详细的Opencv安装说明,结果网页上打开了两个编辑界面,我在一个界面保存了草稿但是没有发布,退出浏览器的时候另一个界面问我是否保存更改,点了确定结果把我之前写的所有东西全部覆盖掉了。。。在线编辑没有版本管理也太不靠谱了。。。

以上为吐槽,以下为重写以后的正文:
本文档的作用在于

  • opencv-4.5.5基于Ubuntu20.04的安装方法
  • vscode 对于opencv的路径配置
  • 一些安装过程中常见错误的解决方案

按照官方说明安装opencv(core modules)

系统环境:Ubuntu 20.04 LTS
opencv版本:opencv-4.5.5

opencv官方链接:https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html

工具准备

  • opencv包(如果不准备的话也可以,可以直接下载)
  • g++
  • cmake
  • wget (非必选)
  • unzip (非必选)
  • libgtk2.0-dev(官方没有提,但是不安装的话运行程序会报错)
  • pkg-config (官方没有提但是一定要安装)
  • 其他一系列工具
  1. 安装以上全部工具的LINUX命令如下所示:
sudo apt update && sudo apt install -y cmake g++ wget unzip
sudo apt install pkg-config libgtk2.0-dev
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev canberra-gtk-module
  1. 从github下载opencv包,并原地解压(如果使用自己下载的opencv包的话可以省略这一步,但记得解压)
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
unzip opencv.zip
  1. 首先进入你的opencv加压出来的文件夹内,新建build文件夹,并进入其中。(官方这个是在opencv包的同级目录下新建build文件夹,我自己更喜欢把build文件放在opencv内部)
mkdir build
cd build
  1. 开始cmake
cmake  ..

cmake过程中的问题说明
在cmake过程中,可能需要从github上下载额外的资源,这时候比较容易出现的一个问题是有一个叫作“ippicv”的包需要远程下载,但是由于网络的问题,很容易就下载失败。这时候我们可以选择在电脑上手动下载,然后采取本地安装的方式安装这个包。具体操作步骤见本文末。

  1. make并设置多线程(-j4就是4线程同时进行的意思,这样可以加快处理速度)
make -j4

make编译完成后,如果成功的话,我们可以在build/lib路径下看到库文件,在build/bin路径下看到一些可执行的文件(样例,测试,apps等),运行以下指令可以查看上述文件是否存在。

ls bin
ls lib

另外,我们也可以在build目录下看到CMake package files,运行以下指令可查看。

ls OpenCVConfig*.cmake
ls OpenCVModules.cmake
  1. 如果上述检查都没问题的话,进行install,install的指令如下
sudo make install

按照默认设置,opencv会被安装到 /usr/local 目录下,所有的文件会被复制到以下位置:

/usr/local/bin - executable files
/usr/local/lib - libraries (.so)
/usr/local/cmake/opencv4 - cmake package
/usr/local/include/opencv4 - headers
/usr/local/share/opencv4 - other files (e.g. trained cascades in XML format)

opencv官方说明:安装过程只将文件复制到预定义的位置,并进行少量的修补。使用这种方法进行安装不会将opencv集成到系统包注册表中,因此,例如,opencv不能自动卸载。由于可能与系统包冲突,我们不建议普通用户进行全系统安装。

验证安装是否成功

安装完成后,我们有必要检验安装是否成功,我一般使用编译opencv自带的samples来检查。步骤如下:

  1. 回到最开始opencv加压出来的那个文件夹内,我们可以看到一个叫做samples文件夹。这个文件夹里面存储了opencv提供的示例文件。执行以下指令进入该文件夹,并在其中创建build目录,然后进入build目录。
cd samples
mkdir build
cd build
  1. 在build目录中依次执行cmake和make指令:
cmake ..
make -j4
  1. 编译完成后,我们可以发现在build目录内多出了一些文件夹,其中cpp文件夹存放的是c++文件编译出来的样例,进入cpp文件夹,我们来运行一个最基本的example_cpp_example示例,输入:
./example_cpp_example

正常情况下,终端只会提示一个no camera的warning,然后会跳出一个窗口,输出“Hello OpenCV”.
在这里插入图片描述

配置vscode

虽然在Linux内成功安装了opencv,但是我们仍然可能发现在vscode里,与opencv相关的模块导入被vscode用红色波浪线标记出来。这是因为vscode不知道从哪里去搜索opencv相关文件。

这时候我们可以在Linux中运行以下指令,搜索opencv相关文件:

sudo find / -iname "*opencv*"

然后我们会得到一堆搜索结果,比如下图这样的:
在这里插入图片描述接着,我们需要在vscode中同时按下Ctrl + Shift + P, 打开命令面板,在命令面板中输入 编辑配置,然后选择C/C++: 编辑配置(UI),如下图所示。
在这里插入图片描述接下来我们会来到Mircrosoft C/C++ 扩展的配置界面(打不开或者搜不到这个命令的话,原因是没有安装C/C++扩展,请在vscode中自行安装)。
在这里插入图片描述界面往下拉,我们会看到包含路径的配置选项,在下面空白中填入刚才查询到的opencv的路径即可。

这里需要说明的是:刚才查询的语句会让我们搜到很多具体文件的路径,但是实际需要填入编辑器路径的其实是目录,所以我们只需要把主要的文件夹填进去就好,比如像我这样只填写到 share/**, lib/**, include/**, bin/**这些路径就可以(后面的**号代表递归搜索),具体如下图所示。

在这里插入图片描述完成路径配置后,回到代码界面,我们会发面报错提示消失,选择头文件可以进行跳转。
在这里插入图片描述

一些错误和解决方案

1. terminate called after throwing an instance of ‘\cv::Exception’

详细报错如下:

./example_tutorial_Smoothing
terminate called after throwing an instance of '\cv::Exception'
  what():  OpenCV(4.5.5-dev) /home/liyao/opencv-4.x/modules/highgui/src/window.cpp:1250: error: (-2:Unspecified 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-config, then re-run cmake or configure script in function 'cvNamedWindow'

Aborted (core dumped)

解决方案:按照提示安装libgtk2.0-dev 和 pkg-config,然后重新cmake和make opencv。

2. Package ‘opencv4’, required by ‘world’, not found

Package opencv4 was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv4.pc'
to the PKG_CONFIG_PATH environment variable
Package 'opencv4', required by 'world', not found
test.cpp:2:9: fatal error: opencv2/opencv.hpp: No such file or directory
 #include<opencv2/opencv.hpp>
         ^~~~~~~~~~~~~~~~~~~~
compilation terminated.

原因是没有将opencv添加到系统路径,解决方案如下第3点所示:

3. 将opencv添加到系统路径

prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: opencv
Description: The opencv library
Version:4.5.5
Cflags: -I${includedir}/opencv4
Libs: -L${libdir} -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann  -lopencv_core

其中version是你的opencv版本。

4. 手动安装ippicv包

参考:https://www.jianshu.com/p/3c2fc0da7398/

  1. 打开opencv解压目录下的opencv-x.x.x\3rdparty\ippicv\ippicv.cmake文件。
  2. 翻到最底部,我们可以看到以下这么一段代码:
 "${OPENCV_IPPICV_URL}"
                 "$ENV{OPENCV_IPPICV_URL}"
                 "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"

这段代码标明了ippicv文件的远程下载路径,但是其中${IPPICV_COMMIT}是一个变量,只有知道了这个变量是什么,我们才能拼凑出完整的地址。

  1. 我们继续向上翻,可以找到以下两段代码:
# Commit SHA in the opencv_3rdparty repo
  set(IPPICV_COMMIT "a56b6ac6f030c312b2dce17430eef13aed9af274")

上面这行的代码就是IPPICV_COMMIT的值。

    if(X86_64)
      set(OPENCV_ICV_NAME "ippicv_2020_lnx_intel64_20191018_general.tgz")
      set(OPENCV_ICV_HASH "7421de0095c7a39162ae13a6098782f9")

上面这行代码是根据我们的系统来决定的,ippicv最终下载哪个版本。
由于我是Ubuntu 20.04, 所以选择的是X86_64下的文件名:ippicv_2020_lnx_intel64_20191018_general.tgz,其中lnx表示Linux。

  1. 把上面三段拼接在一起,就可以获得最终的下载地址。
    https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_lnx_intel64_20191018_general.tgz
  2. 从这个地址下载好ippicv包以后,将这个包拷贝到Linux系统中,我把它放在了和opencv压缩包同级的目录下。不需要解压,我们只需要在刚才的ippicv.cmake文件中将下载目录改为本地就可以:
  set(THE_ROOT "${OpenCV_BINARY_DIR}/3rdparty/ippicv")
  ocv_download(FILENAME ${OPENCV_ICV_NAME}
               HASH ${OPENCV_ICV_HASH}
               URL
                 "${OPENCV_IPPICV_URL}"
                 "$ENV{OPENCV_IPPICV_URL}"
                 "file:///home/你的用户名/ippicv存放的文件夹/"
               DESTINATION_DIR "${THE_ROOT}"
               ID IPPICV
               STATUS res
               UNPACK RELATIVE_URL)
  1. 然后我们继续原本的opencv安装流程,重新cmake一下,程序会自动根据上述我们设置的目录去找到ippicv的安装包,然后安装它。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐