全志V851s移植opencv

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

再次编译

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值