0、前言
移植基于柚木Pi,因为全志的v851s价格便宜并且带有0.5T的NPU,用来跑AI是很合适的,所以我们第一件事就是移植opencv,本文选择的opencv为opencv4.5.4
1、环境配置
第一件事就是先下载opencv相关源码
opencv:Releases - OpenCV
opencv/opencv_contrib: Repository for OpenCV's extra modulesopencv_contrib:opencv/opencv_contrib: Repository for OpenCV's extra modules
自己提前安装好cmake,建议安装cmake_gui
2、准备环境
把下载好的opencv-4.5.4.zip和opencv_contrib-4.5.4.zip放在任意目录下(我这里放在/home/ubuntu下),然后解压opencv-4.5.4.zip至当前目录并重命名为opencv,

进入opencv并创建build(用来存放构建工程)
接着解压opencv_contrib-4.5.4.zip至opencv下,重命名为opencv_contrib
3、文件构建
cd 到build文件夹下,个人习惯使用cmake-gui编译,好处是编译更加方便直观
输入命令 一定要export交叉编译工具链路径!!
export STAGING_DIR=/home/ubuntu/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain
cmake-gui ..


根据自己sdk实际位置填写,我的仅供参考
C: /home/ubuntu/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-gcc
C++: /home/ubuntu/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-c++
TargetRoot: /home/ubuntu/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/
构建完后会有很多爆红,然后需要做三件事
1、在CMAKE_BUILD_TYPE后填上:RELEASE
2、在OPENCV_EXTRA_MODULES_PATH后填上opencv-contrib/modules的路径,比如我的是:/home/ubuntu/opencv/opencv_contrib/modules
3、(可选)勾选BUILD_opencv_world,将 OpenCV 所有静态模块打包编译成一个单独的库文件 libopencv_world.so或 libopencv_world.a,这样方便移植但是会导致库文件很大
4、在build下创建install文件夹,修改CMAKE_INSTALL_PREFIX:PATH=/home/ubuntu/opencv/build/install
5、取消勾选WITH_ADE,WITH_GTK,WITH_TIFF,WITH_PNG,WITH_JPG
(有能力的可以自行解决)
完成之后再次点击Configure按钮,稍等片刻,之后在点击Generate按钮
如果还是有红色报错,请全部取消勾选或者自行解决
然后进入build目录下,执行
cmake .
export STAGING_DIR=/home/ubuntu/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin
make -j20
编译完成后如下

如果没启用 OpenCV 的 单一库模式,下面的操作方式也是一样的
获取编译后的文件
执行
make install
动态库文件 /home/ubuntu/opencv/build/install/lib/
文件库 /home/ubuntu/opencv/build/install/include/opencv4/
注意下面步骤中成功编译出来的固件,是不含动态库的,所以还需要编译时所用的动态库,同步复制到板子的/usr/lib/ 里面去。否则报错找不到动态库
编译测试demo
随便创建一个工程文件夹,创建三个构建文件
1、CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
set (ARM_LINUX_GCC_PATH /home/ubuntu/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/) # 改成你的工具链路径
set (CMAKE_C_COMPILER ${ARM_LINUX_GCC_PATH}arm-openwrt-linux-gcc)
set (CMAKE_CXX_COMPILER ${ARM_LINUX_GCC_PATH}arm-openwrt-linux-g++)
project(Test_OpenCV_Mobile)
set(CMAKE_CXX_STANDARD 11)
set(OpenCV_DIR "/home/ubuntu/opencv/") # 改成你的opencv路径
find_package(OpenCV REQUIRED)
FIND_PACKAGE(OpenMP REQUIRED)
add_executable(Test_OpenCV_Mobile main.cpp)
target_link_libraries(Test_OpenCV_Mobile pthread)
target_link_libraries(Test_OpenCV_Mobile dl)
target_link_libraries(Test_OpenCV_Mobile -fopenmp)
target_link_libraries(Test_OpenCV_Mobile ${OpenCV_LIBS})
2、Makefile (Makefile中命令行前面必须是Tab缩进,尽量自己敲代码,复制容易出问题)
OPENCV_DIR := /home/ubuntu/opencv/build/install/ #执行make install的目标文件夹
THIRD_PART_INCLUDE := -I$(OPENCV_DIR)include/opencv4 -I$(OPENCV_DIR)include/opencv4/opencv2
THIRD_PART_LIBRARY := -L$(OPENCV_DIR)lib/ -lopencv_world
TARGET = Test_OpenCV_Mobile
START:
@echo START
rm -rf $(TARGET)
/home/ubuntu/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-g++ -O2 -std=c++11 -lpthread -fopenmp -ldl $(CFLAGS) $(THIRD_PART_INCLUDE) -o $(TARGET) ./main.cpp $(THIRD_PART_LIBRARY)
.PHONY:clean
clean:
rm -rf $(BINDIR)
3、main.cpp 测试源码
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
cv::Mat mat = cv::Mat::zeros(256,256, CV_8UC1);
{
cv::rectangle(mat, cv::Rect(40, 45, 51, 65), cv::Scalar(255), -1, cv::LINE_8, 0);//绘制填充矩形
cv::rectangle(mat, cv::Rect(180, 180, 85, 21), cv::Scalar(255), -1, cv::LINE_8, 0);//绘制填充矩形
std::cout << "mat.rows = " << mat.rows << std::endl;
std::cout << "mat.cols = " << mat.cols << std::endl;
}
return 0;
}
接下来执行
cmake .
make
测试生成Test_OpenCV_Mobile文件
上板验证
由于我的开发板支持ssh链接,因此我直接用ssh进行文件传输,如果没有网络也可以用sd卡挂载传输文件,我就用ssh演示
将libopencv_world.so.4.5.4传进 /usr/lib

将应用传进/tmp
在 /usr/lib 执行下方命令创建链接
ln -s libopencv_world.so.4.5.4 libopencv_world.so.4.5
ln -s libopencv_world.so.4.5 libopencv_world.so
然后运行测试demo,成功输出
注意:
libopencv_world.so.4.5.4很大,我编译出来的有19MB,由于Tina根文件系统是 overlayfs(基于 /mnt/UDISK)的,/mnt/UDISK只有 10.9M,所以我只能把.so放到/tmp下
(/tmp 是 tmpfs,容量 26M,空闲几乎全部)

因此将.so传入/tmp,并执行
cd /tmp/
ln -s libopencv_world.so.4.5.4 libopencv_world.so.4.5
ln -s libopencv_world.so.4.5 libopencv_world.so
export LD_LIBRARY_PATH=/tmp
./Test_OpenCV_Mobile
同样可以正常输出
遇到的问题
1、zlib缺失
我第一个遇到的问题就是这个,一开始我准备使用构建文件系统时的zlib来进行编译
解决方法:
1、添加以下两个新的 CMake 变量,请根据自己的路径修改
ZLIB_INCLUDE_DIR (PATH类型)
Value:/home/ubuntu/tina-v853-open/out/v851s/lizard/openwrt/staging_dir/target/usr/include
ZLIB_LIBRARY(PATH类型)
Value:/home/ubuntu/tina-v853-open/out/v851s/lizard/openwrt/staging_dir/target/usr/lib
再尝试编译
2、勾选BUILD_ZLIB
![]()
再尝试编译
2、OpenCV: CMAKE_SYSTEM_PROCESSOR is not defined. Perhaps CMake toolchain is broken
解决方法:
修改opencv/cmake/OpenCVDetectCXXCompiler.cmake
在第47行,写入 set(CMAKE_SYSTEM_PROCESSOR arm)

3、提示C++11相关问题
解决方法:
添加
ENABLE_CXX11 (BOOL类型)
Value:ON
CMAKE_CXX_STANDARD (STRING类型)
Value:11
再次编译
1004

被折叠的 条评论
为什么被折叠?



