ardupilot开发 --- opencv 篇

0. 一些概念

官网:https://opencv.org/

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:
    #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; 
    }
    
    CMakeLists.txt:
    # 顶层
    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/

参考文献

【1】tutorial_linux_install.html

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值