RK3588编译Opencv最新版
RK3588编译Opencv最新版
首先介绍笔者的环境:RK3588,Ubuntu20.04,可"正常上网",整个流程在板子上编译完成,这里首先做提醒,最好能保证板子可以"正常上网",因为编译过程中会在github上下载很多文件,网络不好很容易编译失败.无法"正常上网"的可查看我上一篇博客,也许有帮助
1.下载文件
1.1 opencv源码
要下好opencv和opencv-contrib的源码,记住版本一定要对上,这里给出github地址:
opencv:https://github.com/opencv/opencv/releases (下载Source Code就好)
opencv-contrib:https://github.com/opencv/opencv_contrib/tags (记住版本一定要和opencv对上)
这里简单介绍一下opencv-contrib:它是一个包含OpenCV额外模块的代码库。这些模块包含了一些新的、实验性的或不稳定的功能,它们不包含在OpenCV的官方发行版中。这些模块通常没有经过充分的测试,它们的API也可能会发生变化。如果没有特定需求,可以不安装.
1.2 安装cmake
安装好cmake:sudo apt-get install cmake
,如果需要gui界面,输入sudo apt-get cmake-gui
,下文不使用gui
2.开始编译
将opencv和opencv-contrib解压到自己熟悉的路径,例如:/home/develop/
进入opencv文件夹,确认存在CMakeLists.txt
文件,而后新建文件夹builde
,进入文件夹,指令示例:
cd /home/develop/opencv
mkdir build
cd build
接下来是重头戏:输入cmake及编译指令,以下是作者采用的参数,下文将做一些注释,注意,接下来的指令不可直接运行,只是用于解释,读者如需要请根据需求修改或使用后文的纯享版
编译参数解释,官方解释https://docs.opencv.org/4.x/db/d05/tutorial_config_reference.html
-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在这个目录的上级'
整合成一行:
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 ..
然后就会进入漫长的预编译过程,过程中如果出现报错请优先检查以下几个点
- 是否在opencv目录下新建了build文件夹并在里面运行cmake
- opencv文件夹下是否有
CMakeLists.txt
- opencv的版本和opencv-contrib版本是否一致
- opencv-contrib/modules的地址是否正确
- 是否能连接github并下载文件(出错概率最高)
- 报错后重新编译请删除原来
build
下的所有文件,可用sudo rm -rf *
来实现
如果上述问题确认无误但还是出错,请查看cmake后的消息中含有error
,failed
,not
等关键字的信息,然后谷歌
如果成功编译后请在控制台继续输入make -j8
,然后经过漫长的等待,完成后再输入make install
,完成后就可以去你指定的安装目录下查看了
整个编译流程的命令行代码如下:
cd /home/develop/opencv
mkdir build
cd build
sudo cmake -D..#省略,见上文
sudo make -j8
sudo make install
3.设置环境变量
上述工作做完后还需要设置环境变量方便程序识别
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
文件,在里面输入:
#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
,输入:
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})
最后打开终端,新建build文件夹,在里面编译出可执行文件
mkdir build
cd build
cmake ..
make -j8
sudo ./camera-test
不出意外就会显示摄像头的画面了