Linux为树莓派交叉编译OpenCV
获取源代码
在Docker中编译OpenCV前需要对DockerFile做一些简单配置,针对不同版本可以参考整合项目raspberrypi3-opencv-docker
可以从OpenCV官网获取源文件(GIthub)。如有需要也可以同时编译扩展仓库opencv_contrib
编译源码
方法1:
该方案会出现GUI无法安装的问题,导致无法调用可视化接口,如果没有可视化需求可以使用这个方案。
- 以OpenCV3.4.2为例,opencv的交叉编译工具链在
../opencv3.2.0/platforms/linux
路径下,linux文件夹下是一些.cmake
文件,对应不同的移植对象,aarch64-gnu.toolchain.cmake
工具链。 - 在进行编译前,需要修改cmake文件,修改
platform/linux/aarch64-gnu.toolchain.cmake
,改为如下:
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(GNU_MACHINE "aarch64-linux-gnu" CACHE STRING "GNU compiler triple")
include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")
- 接下来执行交叉编译指令:
cmake -D CMAKE_MAKE_PROGRAM:PATH=/usr/bin/make \
-D CMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake \
-D CMAKE_INSTALL_PREFIX=../install_rpi \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.6.0/modules \
-D OPENCV_GENERATE_PKGCONFIG=YES \
..
方法2:
指定编译工具链
- 直接执行交叉编译指令:
在opencv3.2.0下新建文件夹 install_rpi和build,进入build,执行:
cmake -D CMAKE_MAKE_PROGRAM=/usr/bin/make \
-D CMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
-D CMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
-D WITH_QT=ON \
-D CMAKE_INSTALL_PREFIX=../install_rpi \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.6.0/modules \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D BUILD_TIFF=ON \
-D BUILD_JPEG=ON \
..
安装
make install
编译结束后进入 install_rpi
文件夹,里面生成bin,include,lib,share四个文件夹即为最终编译结果。将其拷贝至树莓派/usr/local
目录配置环境变量即可。
如果添加
-D CMAKE_BUILD_TYPE=RELEASE
参数则不会生成bin
文件夹
配置环境变量
其实只用配主机,能够编译即可。
设置/etc/ld.so.conf.d/opencv.conf
vim /etc/ld.so.conf.d/opencv.conf
在opencv.conf中添加opencv拷贝的路径:
# 添加lib文件夹
/usr/local/opencv4.6/lib
加载操作:
ldconfig
设置/etc/bash.bashrc
vim /etc/bash.bashrc
添加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/local/opencv4.6/lib/pkgconfig
export PKG_CONFIG_PATH
更新环境变量:
source /etc/bash.bashrc
其实有更简单的方案,直接在树莓派安装OpenCV:sudo apt-get install
.参考Q-engineering
# **only C++**
$ sudo apt-get install libopencv-dev
# need Python also?
$ sudo apt-get install python3-opencv
测试
pkg-config --modversion opencv
输出正确版本号则证明安装成功
Demo
- 编写绘图测试程序
test_opencv.cpp
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img(512, 512, CV_8UC3, Scalar(255, 255, 255));
circle(img, Point(256, 256), 256, Scalar(0, 0, 255), FILLED);
Rect roi(128, 128, 256, 256);
rectangle(img, roi, Scalar(255, 255, 255), FILLED);
line(img, Point(256, 128), Point(256, 256), Scalar(255, 255, 0), 3);
putText(img, "I'am CV", Point(256, 128), FONT_HERSHEY_DUPLEX, 1, Scalar(0, 0, 0), 2);
imshow("img", img);
waitKey(0);
return 0;
}
- 编写Makefile:CMakeLists.txt
PROJECT (test_opencv)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
# add OpenCV DEP
set(OpenCV_DIR "/usr/local/opencv4.6/share/OpenCV")
find_package(OpenCV REQUIRED)
MESSAGE(STATUS "Project: ${PROJECT_NAME}")
MESSAGE(STATUS "OpenCV library status:")
MESSAGE(STATUS " version: ${OpenCV_VERSION}")
MESSAGE(STATUS " libraries: ${OpenCV_LIBS}")
MESSAGE(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
include_directories(${PROJECT_SOURCE_DIR}/include/)
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)
add_executable (test_opencv "test_opencv.cpp")
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} -lpthread)
- 编译
mkdir build
cmake ..
make
- 运行
./test_opencv
- 运行结果