RK3588 编译opencv&opencv_contrib记录

RK3588 编译opencv&opencv_contrib记录

  • [1. 下载文件](#1. 下载文件)
    • [1.1 opencv源码](#1.1 opencv源码)
    • [1.2 安装cmake](#1.2 安装cmake)
  • 2.开始编译
    • [2.1 提示缺少`boostdesc_bgm.i `等问题](#2.1 提示缺少boostdesc_bgm.i 等问题)
    • [2.2 提示缺少某hpp头文件](#2.2 提示缺少某hpp头文件)
    • [2.3 其它问题](#2.3 其它问题)
  • [3. 设置环境变量](#3. 设置环境变量)
  • [4. 测试](#4. 测试)
  • 5.参考

1. 下载文件

1.1 opencv源码

需要opencv和opencv-contrib的版本号保持一致,如下载opencv-4.5.1和opencv_contrib-4.5.1。github链接如下:
opencv:https://github.com/opencv/opencv/releases
opencv-contrib:https://github.com/opencv/opencv_contrib/tags

1.2 安装cmake

bash 复制代码
sudo apt-get install cmake

2.开始编译

将opencv和opencv-contrib解压到指定路径,如:/opt/opencv_source。进入opencv文件夹,确认存在CmakeList.txt文件,而后新建文件夹build,进入文件夹。命令如下:

bash 复制代码
cd /opt/opencv_source/opencv
mkdir build
cd build

下面是重头戏:cmake编译,命令如下:

bash 复制代码
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/自行修改 -D OPENCV_EXTRA_MODULES_PATH=/自行修改 -D OPENCV_GENERATE_PKGCONFIG=ON -D BUILD_opencv_java=OFF -D BUILD_opencv_python3=ON -D WITH_OPENMP=OFF -D WITH_GSTREAMER_0_10=OFF -D WITH_VTK=OFF -D WITH_LIBV4L=ON -D WITH_OPENMP=ON -D WITH_OPENGL=ON -D WITH_TBB=ON -D BUILD_SHARED_LIBS=ON -D ENABLE_PIC=ON -D WITH_ARITH_DEC=ON -D WITH_ARITH_ENC=ON -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D WITH_IMGCODEC_HDR=ON -D WITH_IMGCODEC_PXM=ON -D WITH_IMGCODEC_SUNRASTER=ON -D WITH_JASPER=ON -D WITH_JPEG=ON -D WITH_LAPACK=ON -D WITH_PNG=ON -D WITH_QT=ON -D WITH_PTHREADS_PF=ON -D WITH_TIFF=ON -D WITH_WEBP=ON -D WITH_GTK=ON -D WITH_OPENCL=ON ..

编译参数官方解释:https://docs.opencv.org/4.x/db/d05/tutorial_config_reference.html

概要:

bash 复制代码
-D CMAKE_BUILD_TYPE=RELEASE \ '采用release格式编译'
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv470 \ 'opencv的最终安装路径,推荐/use/local/使用时不需要有引号'
-D OPENCV_EXTRA_MODULES_PATH=~/opencv-contrib/modules\ 'opencv-contrib下modelus的绝对路径,使用时不需要有引号'
-D OPENCV_GENERATE_PKGCONFIG=ON \ '生成pkg-config文件,使编译成功后可以用指令pkg-config --cflags --libs opencv4来找到opencv'

-D BUILD_opencv_java=OFF \ '是否编译java和python的版本,OFF为不编译,ON为编译,默认不编译'
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_python2=ON \
-D BUILD_SHARED_LIBS=ON \ '用于指定是否构建动态链接库。当这个选项设置为ON时,cmake将生成共享库(.so文件),而不是静态库(.a文件)'
-D ENABLE_PIC=ON \ '用于指定是否生成位置无关代码。当这个选项设置为ON时,编译器将生成PIC,这样生成的代码可以在内存中的任何位置运行,而不需要重定位'

-D WITH_OPENMP=OFF \ '以下是一些第三方的库函数,如果有特定的需求可自行更改,笔者列出的不多,如果你是新手且板子和系统版本和笔者一样,可以和我用一样的'
-D WITH_GSTREAMER_0_10=OFF \
-D WITH_VTK=OFF \
-D WITH_LIBV4L=ON \
-D WITH_OPENMP=ON \
-D WITH_OPENGL=ON \
-D WITH_TBB=ON \
-D WITH_ARITH_DEC=ON \
-D WITH_ARITH_ENC=ON \
-D WITH_FFMPEG=ON \
-D WITH_GSTREAMER=ON \
-D WITH_IMGCODEC_HDR=ON \
-D WITH_IMGCODEC_PXM=ON \
-D WITH_IMGCODEC_SUNRASTER=ON \
-D WITH_JASPER=ON \
-D WITH_JPEG=ON \
-D WITH_LAPACK=ON \
-D WITH_PNG=ON \
-D WITH_QT=ON \
-D WITH_PTHREADS_PF=ON \
-D WITH_TIFF=ON \
-D WITH_WEBP=ON \
-D WITH_GTK=ON \
-D WITH_OPENCL=ON .. '两个点的作用是提示cmake编译所需的CMakeLists.txt在这个目录的上级' 

编译过程很漫长,基本不会一次通过,需要耐心定位错误。我遇到的两个错误,都是由于下载不完全引起的:

2.1 提示缺少boostdesc_bgm.i 等问题

网络搜索并下载这些文件,放到指定目录。下载链接参考该博客

2.2 提示缺少某hpp头文件

该文件不需要下载,可以在opencv文件夹中找到,将opencv-4.5.1/modules/features2d/目录下的文件复制到opencv_contrib-4.5.1/modules/xfeatures2d/test/文件夹下即可。同参考上一博客。

2.3 其它问题

如果还有其它问题,检查以下几个点:

  1. 是否在opencv目录下新建了build文件夹并在里面运行cmake
  2. opencv文件夹下是否有CMakeLists.txt
  3. opencv的版本和opencv-contrib版本是否一致
  4. opencv-contrib/modules的地址是否正确
  5. 是否能连接github并下载文件(出错概率最高)
  6. 报错后重新编译请删除原来build下的所有文件,可用sudo rm -rf *来实现

如果上述问题确认无误但还是出错,请查看cmake后的消息中含有error,failed,not等关键字的信息,然后百度或谷歌,如果成功编译后在控制台继续输入make -j8,然后经过漫长的等待,完成后再输入make install,完成后就可以去你指定的安装目录下查看了。

整个编译流程的命令行代码如下:

bash 复制代码
cd /opt/opencv_source/opencv
mkdir build
cd build
sudo cmake -D..#省略,见上文
sudo make -j8
sudo make install

3. 设置环境变量

上述工作做完后还需要设置环境变量方便程序识别,命令如下;

bash 复制代码
export LD_LIBRARY_PATH=/usr/local/lib/  #示例,修改为自己的opencv安装地址(上文指定的安装目录)

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig #示例,请修改为自己的opencv安装地址(上文指定的安装目录)

export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/usr/lib/ #示例,请修改为自己的opencv安装地址(上文指定的安装目录)

4. 测试

用C++测试opencv,调用摄像头并在屏幕上显示内容,使用USB免驱摄像头。

先用v4l2-ctl --list-devices查看自己摄像头的编号,然后替换掉cpp文件中VideoCapture cap(0)的数字,新建camera_test.cpp文件,输入:

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    cout << cv::getBuildInformation() << endl //查看一下opencv的编译信息,记得保存下来好好看,以后遇到路径问题以这个为准
    VideoCapture cap(0); // 更改自己的摄像头编号
    if(!cap.isOpened())
    {
        cout << "无法打开摄像头" << endl;
        return -1;
    }
    // 创建窗口
    namedWindow("摄像头", WINDOW_AUTOSIZE);
    while(true)
    {
        Mat frame;
        // 从摄像头捕获一帧图像
        cap >> frame;
        if(frame.empty())
            break;
        // 在窗口中显示图像
        imshow("摄像头", frame);
        // 按下 ESC 键退出
        if(waitKey(30) == 27)
            break;
    }
    // 释放资源
    cap.release();
    destroyAllWindows();
    return 0;
}

然后在同一文件夹下新建CMakeLists.txt,输入:

cpp 复制代码
cmake_minimum_required(VERSION 3.1)
project(camera_test)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(camera_test camera_test.cpp)
target_link_libraries(camera_test ${OpenCV_LIBS})

可正常显示摄像头画面,则测试通过。

5.参考

  1. https://www.cnblogs.com/Rubyen2333/p/17337164.html
  2. https://cloud.tencent.com/developer/article/2397211
  3. https://www.cnblogs.com/zhang-hongbo/p/12859405.html
相关推荐
CYBEREXP200841 分钟前
MacOS M3源代码编译Qt6.8.1
c++·qt·macos
yuanbenshidiaos1 小时前
c++------------------函数
开发语言·c++
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
tianmu_sama2 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
羚羊角uou2 小时前
【C++】优先级队列以及仿函数
开发语言·c++
姚先生972 小时前
LeetCode 54. 螺旋矩阵 (C++实现)
c++·leetcode·矩阵
FeboReigns2 小时前
C++简明教程(文章要求学过一点C语言)(1)
c语言·开发语言·c++
FeboReigns2 小时前
C++简明教程(文章要求学过一点C语言)(2)
c语言·开发语言·c++
264玫瑰资源库3 小时前
从零开始C++棋牌游戏开发之第二篇:初识 C++ 游戏开发的基本架构
开发语言·c++·架构
小陈phd3 小时前
OpenCV学习——图像融合
opencv·计算机视觉·cv