之前在Windows上借助VS编译opencv,很轻松就能搞定,到Linux下踩了坑,Ubuntu下编译、卸掉重编、搞了几次,还把系统库给卸载掉了(sudo apt-get remove python3.6千万不要尝试).....如果你也通过卸载python2.x、python3.x把系统搞挂了,没有了桌面,千万不要慌~首先,卸载了就搞干净点:sudo apt-get autoremove,然后,安装一个全新的Ubuntu桌面,sudo apt-get install ubuntu-desktop,最后你会发现,有惊无险,桌面回来了!!!
下面回到正题:Ubuntu18.04安装opencv-3.4.x(5.6.8都试过,没问题)
原文转载自:语雀文档 ,样式更好看:)
1 源码下载
官网:https://opencv.org/releases/ Github:https://github.com/opencv/opencv 随便从哪下载,都可以
2. apt-get安装
Ubuntu下,OpenCV的安装方式有两种:
- 1.通过apt-get 安装opencv-python
- 2.从源码构建
方式1.很简单:直接$ sudo apt-get install python-opencv
如果你只是在python中简单使用opencv,首选此种方式安装,如果你需要在其他项目中编译引用opencv,建议从源码构建安装;还有一点:python-opencv里的代码可能没有源码更新的及时,从源码构建虽然复杂,不过稳定些、可控性更强。下文主要介绍通过源码构建安装OpenCV,系统及版本:Ubuntu18.04 + Opencv3.4.8。
3 从源码安装
从源码编译安装的方式又有两种:
- 默认位置安装
- 自定义位置安装
推荐默认位置安装,安装后可执行文件和lib文件都会安装到系统相应路径,方便使用。自定义位置安装则需要自己设置环境变量和其他的设置。如果只是简单应用,不是对opencv各个版本有使用区分,建议直接默认位置安装。 不论是默认安装还是自定义位置、安装前都需要安装一些构建必须的依赖项。
3.1 构建依赖项
安装前需要下载一些必须的依赖项。 不同版本opencv依赖会有不同,具体见官网,下面的依赖项适用于opencv-3.4.8
官网:https://docs.opencv.org/3.4.8/d2/de6/tutorial_py_setup_in_ubuntu.html
1.cmake gcc g++ 通常系统都有,可以cmake(gcc/g++) --version查看其版本:
有的话无需安装,否则可以执行如下命令安装:
sudo apt-get install cmake
sudo apt-get install gcc g++
2.安装python2、python3支持模块
可选、譬如你可以只打算在python3里用opencv,那么就忽略python2的模块安装。
# 安装python2支持
sudo apt-get install python-dev python-numpy
# 安装python3支持
sudo apt-get install python3-dev python3-numpy
3.GTK支持(图形界面库)
# 安装gtk2支持
sudo apt-get install libgtk2.0-dev
# 安装gtk3支持
sudo apt-get install libgtk-3-dev
4.可选图片支持库
用于处理多种图片格式(可选)
sudo apt-get install libpng-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libopenexr-dev
sudo apt-get install libtiff-dev
sudo apt-get install libwebp-d
5.下载ippcv
cmake时会自动下载ippcv,如果不翻墙可能速度过慢,导致cmake一直卡在那,解决方法:下载压缩包 ippicv_2019_lnx_intel64_general_20180723.tgz 放在opencv源码主目录/3rdparty/ippicv/下,同时修改统计目录下的ippicv.cmake,把47行的下载链接换成本地文件:file: ROOT_DIR/3rdparty/ippicv/ippicv_2019_lnx_intel64_general_20180723.tgz
3.2 默认位置安装
git clone或官网下载的压缩包解压后得到opencv源码包,切换到源码主目录
# 新建build文件夹,存放构建文件
$ mkdir build
$ cd build
执行cmake,构建CMakeLists.txt自动化创建makefile,cmake需要之前可以指定一些构建参数,用来确定安装位置、是否为python2/python3执行安装等、构建的类型是否是release等,如果不指定参数,直接傻瓜式cmake也是可以的。
# 傻瓜式cmake
cmake ../
# 带参数cmake 默认位置安装
cmake ../ -DWITH_CUDA=OFF -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_EXAMPLES=ON -DBUILD_DOCS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF
# 带参数cmake 自定义位置安装
cmake ../ -DWITH_CUDA=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/opencv/opencv-3.4.8 -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_EXAMPLES=ON -DBUILD_DOCS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF
注意,-D是cmake执行时指定的参数 CMAKE_INSTALL_PREFIX是默认安装路径前缀,如不指定,默认是/usr/local,也可以指定自定义文件夹(见下面的【自定义安装】);WITH_CUDA默认是开启的,如果不指定OFF则opencv编译时会默认使用可用的CUDA,虽然速度会提升,不过可能会和其他使用cuda的深度学习框架有冲突,建议根据opencv实际使用情况来决定是否开启CUDA加速!CMAKE_BUILD_TYPE可以根据需要选择DEBUG或RELEASE。
cmake选项设置参考:
https://docs.opencv.org/3.4/d7/d9f/tutorial_linux_install.html http://amritamaz.net/blog/opencv-config
cmake主要是用于生产Makefile的,正式的构建还没开始,执行make -j8构建
# 执行make编译,-j8参数表示允许cpu并行编译,最多允许8个线程,可以大大加速构建过程
# -j根据自己cpu核心数设定,6核可以设为-j6~-j12
make -j8
构建过程耗时几分钟,完成后,需要make install将编译生成的可执行文件和lib文件等,安装到系统相应目录。
# 安装编译好的可执行文件
sudo make install
默认位置安装,则会安装到系统如下目录:
- /usr/local/bin
- /usr/local/lib
- /usr/local/share
bin下的可执行文件:
lib是库文件,主要是以libopencv开头的so文件、文件夹:pkgconfig、python2.x、python3.x(pkgconfig里存放的是opencv.pc);share里就两个文件夹:OpenCV和licenses 安装好还需要进行配置,见下面【配置】一节
3.3 自定义位置安装
自定义位置安装,前面的步骤都和默认安装一致,主要是cmake时需要指定编译参数-DCMAKE_INSTALL_PREFIX为自己指定的目录,然后增加相应的设置:主要是设置扫描路径和设置环境变量。**
自定义安装,执行sudo make install后,会安装到自定义目录的相应位置,譬如,我自定义目录: /usr/local/opencv/opencv-3.4.8,下文用OPENCV_DIR_PATH代表。则安装到以下位置:
- /usr/local/opencv/opencv-3.4.8/bin
- /usr/local/opencv/opencv-3.4.8/lib
- /usr/local/opencv/opencv-3.4.8/share
3.3.1 设置扫描路径
设置扫描路径,这块主要针对自定义位置安装,项目编译后产生的可执行文件、库文件、头文件需要被别的项目引用,扫描路径怎么设置?也有两种方式:
- 1.复制opencv.pc至系统pkgconfig文件夹中
- 2.将opencv.pc所在目录设定到环境变量PKG_CONFIG_PATH
OpenCV编译后会在/OPENCV_DIR_PATH/lib/pkgconfig/下产生opencv.pc文件,里面定义了这些路径变量:
prefix定义了编译安装的主目录;exec_prefix则是可执行文件目录;然后还有include文件夹目录等等。
通过/usr/bin/下的pkg-config命令,会扫描所有系统/usr/lib/下和环境变量PKG_CONFIG_PATH所定义的所有pkgconfig文件夹,这些文件夹都是存放各个程序编译信息.pc文件,pkg-config扫描后,这些.pc文件保存的编译信息就能被其他项目/程序获取。(.pc文件主要定义了安装程序的主目录prefix、可执行程序目录exec_prefix、lib目录libdir、包含目录includedir、sharedlibdir等,有点类似于环境变量,不过更多是为了程序编译服务的)
# 查看所有系统将会扫描的pkgconfig文件夹路径;
pkg-config --variable pc_path pkg-config
#根据opencv.pc查看其有那些路径变量
pkg-config --print-variables opencv
#查看opencv.pc中prefix变量的值(即其编译安装的位置)
pkg-config --variable prefix opencv
自定义安装,我们会在/OPENCV_DIR_PATH/lib/pkgconfig/下发现opencv.pc。于是我们有两种选择: 1.复制opencv.pc至系统pkgconfig文件夹中 **理论上可以将opencv.pc复制到任意一个 **pkg-config --variable pc_path pkg-config
列出的pkgconfig文件夹中,不过最好复制到/usr/local/lib/pkgconfig/下。 例:
cd /OPENCV_DIR_PATH/lib/pkgconfig
sudo cp opencv.pc /usr/local/lib/pkgconfig
Ubuntu18.04安装后,系统自带了opencv3.2.0,默认将opencv.pc存放在/usr/lib/x86_64-linux-gnu/pkgconfig/下,如果需要将opencv.pc复制到这里,可以先将系统自带的opencv.pc备份下,然后再cp过去。 2.将opencv.pc所在目录设定到环境变量PKG_CONFIG_PATH
#修改bash.bashrc文件
sudo vim /etc/bash.bashrc
# 在最后加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/OPENCV_DIR_PATH/lib/pkgconfig
export PKG_CONFIG_PATH
source /etc/bash.bashrc
#查看变量是否生效
echo $PKG_CONFIG_PATH
3.3.2 设置环境变量
这里有两块:
1.设置OpenCV的环境变量(可选,不建议) 如果编译时默认安装的位置是系统bin和lib文件夹、所以可执行文件和lib文件都可以立即执行。譬如:opencv_version这个可执行程序,由于其路径属于系统路径:usr/bin/opencv_version,故可以在任意shell窗口中直接运行,自定义位置安装的则不可以。故可以为其设置环境变量,不过通常也不需要,原因有两点:1.opencv的可执行命令较少2.通常我们编译OpenCV并不是为了得到其可执行文件,而是为了得到lib文件夹中的.so库文件,供其他程序/项目直接引用。
2.设置Python的cv2包的环境变量(必须) 自定义位置编译时,可能会出现一种情况,编译成功安装成功,OpenCV的c++demo也可以正常运行,但是进入python环境import cv2时会发现找不到包。因为自定义编译时,生成的cv2模块路径是: /OPENCV_DIR_PATH/lib/python3.6/dist-packages 需要将此路径设置加入环境变量PYTHONPATH中,以便于python环境中import时可以找到cv2。
# 新增PYTHONPATH环境变量
sudo vim ~/.bashrc
export PYTHONPATH=$PYTHONPATH:/OPENCV_DIR_PATH//lib/python3.6/dist-packages
#如:export PYTHONPATH=$PYTHONPATH:/usr/local/opencv/opencv-3.4.8/lib/python3.6/dist-packages
source ~/.bashrc
然后,我们就可以正常在python环境中import cv2了。
安装好还需要进行配置,见下面【配置】一节
4. 配置
主要是将opencv的lib路径添加到配置,能被系统扫描到,有什么用?其他项目,如darknet构建时需要用到opencv的lib,就可以直接引用到。
sudo gedit /etc/ld.so.conf.d/opencv.conf
将你opencv安装目录/lib路径写入opencv.conf,并保存。如果你编译时是默认安装,路径是: /usr/local/lib。
保存后刷新,使配置生效
#刷新lib库目录
sudo ldconfig
#刷新目录缓存
sudo /sbin/ldconfig
有的教程写的是:编辑/etc/ld.so.conf,在最后加入 include /usr/local/lib
,效果一样
5. 验证
查看版本
方式一:shell中直接查看
pkg-config opencv --modversion
方式二:python中查看
>>>import cv2;
>>>cv2.__version_``_
Python dmeo
import cv2 as cv
img = cv.imread('/home/lyon/Desktop/helloworld.jpg',1)
cv.imshow('Image',img)
cv.waitKey(0)
效果:桌面弹出一个图片框:
C++ demo
找到你的opencv源码包,假如是opencv-3.4.8,cd到opencv-3.4.8/samples/cpp/example_cmake/下执行官方给出的demo,需要执行cmake和make来编译cpp文件:
cmake .
make
./opencv_example
执行demo会调用打开Sample窗口,并调用你本地摄像头显示画面,没有摄像头画面如下:
如果你是自定义路径安装的,请注意一下: 看一下CmakeLists.txt的内容:
注释中表示,你需要设置变量OpenCV_DIR来找到OpenCVConfig.cmake文件的位置。通常如果你是执行默认位置安装,那么系统默认路径为:/usr/share/OpenCV/OpenCVConfig.cmake。如果你是自定义位置安装,需要通过在CmakeLists.txt中设置OpenCV_DIR变量的路径,来定位到你的Opencv目录,譬如:
set(OpenCV_DIR /usr/local/opencv/opencv-3.4.8/share/OpenCV/)
6. 卸载
卸载相比安装,容易了许多,还是cd到opencv源码主目录/build文件夹下 sudo make uninstall
执行sudo make uninstall可将opencv相关的可执行文件、lib文件等从/usr/local/bin/、/usr/local/lib、usr/local/share中删除,不过还是会留空下文件夹,需要手动删除。可以继续执行:sudo make clean
将源码包内的编译相关文件删除、最后在build文件夹内执行sudo rm rf *
删除源码包内所有文件。
有用的话,请点个赞哦 :)
<iframe frameborder="0" allowfullscreen="" src="https://www.zhihu.com/video/1181704421771218944?autoplay=false&useMSE=" style="display: block; width: 688px; height: 387px;"></iframe>
Yolo+Opencv目标检测Demo—西西里