抱着盒子的姑娘和擦汗的男人
0. 一些概念
1. 卸载
1.1 apt 方式安装的卸载方式
sudo apt-get --purge remove libopencv
sudo apt-get --purge remove libopencv-dev
sudo apt-get --purge remove libopencv*
sudo apt-get --purge remove opencv
sudo apt-get --purge remove *opencv*
sudo apt-get autoremove
sudo apt-get autoclean
手动sudo rm-rf
的方式把卸载过程中提示的没删除的文件夹删除:
查看卸载残留:
sudo find /usr/ -name "*opencv*"
手动删除残留文件:
sudo find /usr/ -name "opencv*" | xargs sudo rm -rf
1.2 make install 方式安装的卸载方式
cd ~/opencv-ws/opencv/build
sudo make uninstall
查看卸载残留:
sudo find /usr/ -name "*opencv*"
手动删除残留文件:
sudo find /usr/ -name "opencv*" | xargs sudo rm -rf
2. 安装
安装可参考:
【1】https://opencv.org/get-started/
【2】https://docs.opencv.org/4.x/df/d65/tutorial_table_of_content_introduction.html
2.1 apt 方式安装
以Ubuntu20.04环境为例。
sudo apt-get install libopencv-dev
默认安装位置:usr/local
2.2 编译源码方式安装
通过apt安装的opencv其实并不是完整的opencv,因为如cudev、cudaarithm、cudawarping等包并没有包含在 libopencv-contrib-dev package 中。因此,通过编译源码的方式安装opencv是非常有必要的。
安装依赖
基本依赖:
apt install libx11-dev liblapack-dev liblapacke-dev libeigen3-dev libv4l-dev libzbar-dev libpthread-stubs0-dev libjpeg-dev libpng-dev
apt install -y cmake g++ wget unzip
高级依赖(包含了基本依赖):
apt update
apt install cmake cmake-curses-gui g++ build-essential git wget unzip pkg-config
# 图像、视觉io库
apt install libv4l-dev libdc1394-22-dev libjpeg-dev libopenjp2-7-dev libpng-dev
# Linux系统的图形界面渲染、GUI交互
apt install libx11-dev
# Linux系统的图形界面渲染库,GUI 工具包,支持创建窗口、按钮、菜单、文本框等界面组件
apt install libgtk2.0-dev
# 数学运算库、运算加速库
## libeigen3-dev
apt install libeigen3-dev
## blas
apt install libblas-dev
## lapack
apt install gfortran liblapack-dev liblapacke-dev
## 注意:openblas、atlas、gsl可选择性安装
## openblas
apt install libopenblas-dev
## atlas
apt install libatlas-base-dev
## gsl
apt install libgsl-dev
# 二维码或条形码识别库
apt install libzbar-dev
# Linux下的POSIX线程开发库,提供pthread(POSIX线程)
apt install libpthread-stubs0-dev
# ffmpeg库
apt install ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev
# Gstreamer
apt install libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev
apt install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav
apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
# libgstreamer-plugins-bad1.0-dev 这个包会安装依赖包 libopencv-dev,如果想要用 make install 安装opencv,这个包应该在make install opencv 后再用apt安装
# C++中处理json
apt install nlohmann-json3-dev
下载源码
- 用 wget (推荐使用wget因为git太慢而且国内容易被墙):
# Download and unpack sources
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.x.zip
unzip opencv.zip
unzip opencv_contrib.zip
- 用 git :
mkdir -p ~/opencv-ws
cd ~/opencv-ws
git clone https://github.com/opencv/opencv
git clone https://github.com/opencv/opencv_contrib
配置
-
配置编译选项:
mkdir -p build && cd build cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.x/modules -DWITH_CUDA=ON -DBUILD_opencv_cudev=ON -DBUILD_opencv_cudaarithm=ON -DBUILD_opencv_cudawarping=ON -S ../opencv-4.x
-
配置方式:
cmake -Doption=value
-
都有哪些编译选项(option)可配置?
(1)查阅这里:OpenCV configuration options reference
(2)或直接用 ccmake 查看:ccmake <顶层CMakeLists.txt 路径>
(3)cmake -L# initial configuration cmake ../opencv # print all options cmake -L # print all options with help message cmake -LH # print all options including advanced cmake -LA
-
其他
所有的 编译选项 都被定义在项目的顶层CMakeLists.txt和子层CMakeLists.txt中;
什么是 编译选项 ?看这里; -
注意:在Cmake过程中会从互联网下载一些文件以满足库依赖性,连接故障可能导致某些模块或功能关闭或表现不同。
如果在build过程中遇到问题,可尝试清理或重建build目录。或cmake时禁用依赖关系、切换到另一个分支…
编译
make -j$(nproc)
安装
sudo make install
默认安装位置:usr/local
3. 检查OpenCV是否编译了FFmpeg支持
参考:文心一言 搜索关键句“检查OpenCV是否编译了FFmpeg支持”
- 方法1,检查OpenCV的编译配置
查看CMake的输出或CMakeCache.txt文件来确认FFmpeg是否被成功包含。 - 方法2,使用OpenCV的cv::getBuildInformation()
ifOpencvSupportFFmpeg.cpp:
CMakeLists.txt:#include <cstdio> #include <opencv2/opencv.hpp> #include <iostream> int main(int argc, char **argv){ std::string info = cv::getBuildInformation(); std::cout << info << std::endl; // 你可以搜索字符串来查找"FFmpeg" if (info.find("FFmpeg") != std::string::npos || info.find("ffmpeg") != std::string::npos || info.find("FFMPEG") != std::string::npos) { std::cout << "FFmpeg support is enabled." << std::endl; } else { std::cout << "FFmpeg support is not enabled." << std::endl; } return 0; }
# 顶层 cmake_minimum_required(VERSION 3.10) project(RTSPio VERSION 0.1) # 寻找OpenCV库 find_package(OpenCV REQUIRED) # ifOpencvSupportFFmpeg # 添加可执行文件 add_executable(ifOpencvSupportFFmpeg) target_sources(ifOpencvSupportFFmpeg PRIVATE ifOpencvSupportFFmpeg.cpp) # 添加头文件 target_include_directories(ifOpencvSupportFFmpeg PRIVATE /usr/include/opencv4/) # 链接OpenCV库 target_link_libraries(ifOpencvSupportFFmpeg ${OpenCV_LIBS})
4. 检查OpenCV是否编译了某模块/库的支持
方法同上一节。
problems shooting
明明安装了某个依赖包,cmake配置时提示找不到?
解决过程:
(1)apt 查看包是否正确安装:apt list --installed openblas
(2)pkg-config查看包的头文件、库文件路径。
(3)查看cmake是如何查找的OpenBLAS,相关的环境变量是哪个?
find / -iname "*OpenBLAS*" | grep -E "*.cmake"
可知cmake查找OpenBLAS库时会去这些路径中查找:
SET(Open_BLAS_INCLUDE_SEARCH_PATHS
$ENV{OpenBLAS_HOME}
$ENV{OpenBLAS_HOME}/include
$ENV{OpenBLAS_HOME}/include/openblas
/opt/OpenBLAS/include
/usr/local/include/openblas
/usr/include/openblas
/usr/local/include/openblas-base
/usr/include/openblas-base
/usr/local/include
/usr/include
)
SET(Open_BLAS_LIB_SEARCH_PATHS
$ENV{OpenBLAS}
$ENV{OpenBLAS}/lib
$ENV{OpenBLAS_HOME}
$ENV{OpenBLAS_HOME}/lib
/opt/OpenBLAS/lib
/usr/local/lib64
/usr/local/lib
/lib/openblas-base
/lib64/
/lib/
/usr/lib/openblas-base
/usr/lib64
/usr/lib
)
FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Open_BLAS_INCLUDE_SEARCH_PATHS} NO_DEFAULT_PATH)
FIND_LIBRARY(OpenBLAS_LIB NAMES openblas libopenblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS} NO_DEFAULT_PATH)
SET(OpenBLAS_FOUND ON)
# Check include files
IF(NOT OpenBLAS_INCLUDE_DIR)
SET(OpenBLAS_FOUND OFF)
MESSAGE(STATUS "Could not find OpenBLAS include. Turning OpenBLAS_FOUND off")
ENDIF()
# Check libraries
IF(NOT OpenBLAS_LIB)
SET(OpenBLAS_FOUND OFF)
MESSAGE(STATUS "Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off")
ENDIF()
解决办法:创建两个环境变量,将通过pkg-config得到的路径赋值给这两个环境变量。
export OpenBLAS_HOME=/usr/include/x86_64-linux-gnu/openblas-pthread/
export OpenBLAS=/usr/lib/x86_64-linux-gnu/openblas-pthread/