郁闷死了。。昨天重装Ubuntu,重写了一份巨详细的Opencv安装说明,结果网页上打开了两个编辑界面,我在一个界面保存了草稿但是没有发布,退出浏览器的时候另一个界面问我是否保存更改,点了确定结果把我之前写的所有东西全部覆盖掉了。。。在线编辑没有版本管理也太不靠谱了。。。
以上为吐槽,以下为重写以后的正文:
本文档的作用在于:
系统环境:Ubuntu 20.04 LTS
opencv版本:opencv-4.5.5
opencv官方链接:https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html
工具准备:
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
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
unzip opencv.zip
mkdir build
cd build
cmake ..
cmake过程中的问题说明:
在cmake过程中,可能需要从github上下载额外的资源,这时候比较容易出现的一个问题是有一个叫作“ippicv”的包需要远程下载,但是由于网络的问题,很容易就下载失败。这时候我们可以选择在电脑上手动下载,然后采取本地安装的方式安装这个包。具体操作步骤见本文末。
make -j4
make编译完成后,如果成功的话,我们可以在build/lib
路径下看到库文件,在build/bin
路径下看到一些可执行的文件(样例,测试,apps等),运行以下指令可以查看上述文件是否存在。
ls bin
ls lib
另外,我们也可以在build目录下看到CMake package files,运行以下指令可查看。
ls OpenCVConfig*.cmake
ls OpenCVModules.cmake
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来检查。步骤如下:
samples
文件夹。这个文件夹里面存储了opencv提供的示例文件。执行以下指令进入该文件夹,并在其中创建build目录,然后进入build目录。cd samples
mkdir build
cd build
cmake ..
make -j4
cpp
文件夹存放的是c++文件编译出来的样例,进入cpp文件夹,我们来运行一个最基本的example_cpp_example
示例,输入:./example_cpp_example
正常情况下,终端只会提示一个no camera的warning,然后会跳出一个窗口,输出“Hello OpenCV”.
虽然在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/**这些路径就可以(后面的**号代表递归搜索),具体如下图所示。
完成路径配置后,回到代码界面,我们会发面报错提示消失,选择头文件可以进行跳转。
详细报错如下:
./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。
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
^~~~~~~~~~~~~~~~~~~~
compilation terminated.
原因是没有将opencv添加到系统路径,解决方案如下第3点所示:
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版本。
参考:https://www.jianshu.com/p/3c2fc0da7398/
opencv-x.x.x\3rdparty\ippicv\ippicv.cmake
文件。 "${OPENCV_IPPICV_URL}"
"$ENV{OPENCV_IPPICV_URL}"
"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"
这段代码标明了ippicv文件的远程下载路径,但是其中${IPPICV_COMMIT}
是一个变量,只有知道了这个变量是什么,我们才能拼凑出完整的地址。
# 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。
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)