opencv riscv的交叉编译与测试

opencv riscv的交叉编译与测试

标签: RISCV  opencv  编译器

目录

编译与测试环境:

opencv版本:opencv4.2
opencv4.2下载地址:GitHub - opencv/opencv at 4.2.0
riscv交叉编译工具链:riscv64-unknown-linux-gnu-gcc/g++
riscv交叉编译链地址:GitHub - riscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC
测试环境:qemu-riscv64
qemu-riscv地址:GitHub - riscvarchive/riscv-qemu: QEMU with RISC-V (RV64G, RV32G) Emulation Support

riscv交叉工具链安装说明:

 # 拉取编译链代码(需要科学上网)
 git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
 
# 安装所需依赖
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

# 设置环境路径 如将/opt/riscv作为工具链安装路径,将/opt/riscv/bin加入环境变量路径中
# 编译
./configure --prefix=/opt/riscv
make linux
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

qemu-riscv64安装说明

# 安装所需依赖
sudo apt-get install gcc libc6-dev pkg-config bridge-utils uml-utilities zlib1g-dev libglib2.0-dev autoconf automake libtool libsdl1.2-dev

# 拉取代码
git clone https://github.com/riscv/riscv-qemu
cd riscv-qemu
git submodule update --init pixman

# 编译
./configure --target-list=riscv64-linux-user [--prefix=INSTALL_LOCATION]
make
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

交叉编译opencv

创建bulid目录,打开cmake-gui设置soucecode和bulid路径

cmake-gui选项:

参考:嵌入式开发之Opencv(一)交叉编译
在这里插入图片描述
在这里插入图片描述
可以根据需要选择需要build的功能模块
在这里插入图片描述
打开Advancd选项, 我另外设置了这些选项:
CMAKE_BUILD_TYPE Release
CMAKE_EXE_LINKER_FLAGS -lrt -lpthread
CMAKE_INSTALL_PREFIX /usr/lcoal/riscv/open-riscv # 自定义安装目录(默认是/usr/local)

Configure生成之后进入bulid目录,make即可!

遇到的错误:

  • 错误1:找不到zlib.h
fatal  error: zlib.h: No such file or directory
  • 1
  • 解决办法:
    用riscv工具链交叉编译zlib库,并install到riscv工具路目录处
    交叉编译zlib库参考:zlib的交叉编译

  • 错误2:找不到进程库
../opencv3.4.0/3rdparty/protobuf/src/google/protobuf/stubs/common.cc:51:2: error: “No suitable threading library available.”
  • 1

  • 错误3:类型转换错误
../opencv-4.1.1/modules/imgcodecs/src/grfmt_jpeg.cpp:224:58:
error: invalid conversion from ‘uchar* {aka unsigned char*}’ to ‘const JOCTET* {aka const char*}’ [-fpermissive]
state->source.pub.next_input_byte = m_buf.ptr();
  • 1
  • 2
  • 3

在这里插入图片描述
相关链接:cross compile arm-linux show errors invalid conversion · Issue #15308 · opencv/opencv · GitHub(同一个错误)

  • 解决办法:
    之前cmake-gui时按默认选中的bulid模块编译时会遇到这个错,后来选择部分功能模块bulid就没遇到这个错了。(暂时随缘吧~)

测试opencv-riscv

测试程序:

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgproc/types_c.h"
using namespace cv;

//将图片灰度化并保存
int main()
{
	Mat image;
	image = imread("./img.jpg");
	if(!image.data)
	{
		printf("No image data \n");
		return -1;
	}else{
		printf("read the image!\n");
	}
	Mat dst;
	cvtColor(image,dst,CV_BGR2GRAY);
	imwrite("dst.jpg", dst);
	printf("change success!\n");
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

编译命令:

riscv64-unknown-linux-gnu-g++ DisplayImage.cpp  -o DispalyImage       -I /usr/local/riscv/opencv-riscv/include/opencv4 
-L /usr/local/riscv/opencv-riscv/lib -lopencv_core  -lopencv_imgcodecs -lopencv_imgproc -lz

#-I Dir 指定include目录,在该目录下寻找引用的头文件
#-L Dir 指定库文件目录,在该目录下寻找链接的库文件
  • 1
  • 2
  • 3
  • 4
  • 5

运行:

编译成功在qume-riscv64上运行

qemu-riscv64 -L /opt/riscv/64/sysroot DisplayImage
  • 1

运行结果:

生成灰度化的图片
在这里插入图片描述


测试时遇到的错误:

  • 错误1:找不到头文件
fatal error: opencv2/opencv.hpp: No such file or directory
  • 1
  • 解决办法:
    编译的时候加上
    -I /usr/local/riscv/opencv-riscv/include/opencv4 指定安装的opencv的include目录

  • 错误2:找不到库文件
ld: cannot find -lopencv_core
ld: cannot find -lopencv_imgcodecs
...
  • 1
  • 2
  • 3
  • 解决办法:
    编译的时候加上
    -L /usr/local/riscv/opencv-riscv/lib 制定opencv库文件的目录

  • 错误3:
undefined reference to `gzopen'
undefined reference to `gzclose'
undefined reference to `gzgets'
undefined reference to `gzputs'
  • 1
  • 2
  • 3
  • 4
  • 问题与解决办法:
    缺少zlib库引起的, 编译链接时加上 -lz
    由于zlip库之前安装在riscv工具链的目录,而编译测试文件时链接的目录为opencv的目录,建议把zlib重新安装在opencv的目录里面(不然链接时可能会找不到zlib)。

  • 错误4:
undefined reference to symbol '_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3'
  • 1
  • 解决办法:
    用riscv64-unknown-linux-gnu-gcc编译会遇到这个错,改为riscv64-unknown-linux-gnu-g++编译

  • 错误5:
    编译测试文件成功后,运行时遇到加载动态库时找不到动态库文件
DisplayImage:error while loading shared libraries: libopencv_core.so.4.2: cannot open shared object file: No such file or directory
  • 1
  • 解决办法:
    设置环境变量,增加动态库目录路径到该变量中,再重新运行
    export LD_LIBRARY_PATH="/usr/local/riscv/opencv-riscv/lib:$LD_LIBRARY_PATH"

版权声明:本文为ALLap97原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:opencv riscv的交叉编译与测试_riscv-newlib库 opencv-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于在其他平台上交叉编译OpenCV 4,你可以按照以下步骤进行操作: 1. 安装交叉编译工具:根据你的目标平台,安装相应的交叉编译工具。这通常是由硬件供应商提供的,可以在他们的官方网站上找到。 2. 下载OpenCV源代码:从OpenCV官方网站(https://opencv.org/releases/)下载最新版本的OpenCV源代码。 3. 解压源代码:将下载的源代码解压到你的开发环境中。 4. 创建构建目录:在解压后的源代码所在的目录中,创建一个新的目录用于构建OpenCV。 5. 进入构建目录:打开终端,并进入构建目录。 6. 配置交叉编译环境:在终端中运行以下命令,配置交叉编译环境: ``` cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain_file.cmake .. ``` 将`/path/to/toolchain_file.cmake`替换为你实际的交叉编译工具文件路径。 7. 配置其他参数:根据你的需求,可以使用其他CMake选项来配置OpenCV。例如,你可以指定安装路径、启用/禁用特定模块等。 8. 执行编译:运行以下命令开始编译OpenCV: ``` make ``` 9. 安装OpenCV:完成编译后,运行以下命令安装OpenCV: ``` make install ``` 10. 完成!现在你可以在交叉编译的目标平台上使用OpenCV 4了。 请注意,具体的步骤可能因你的开发环境和目标平台而有所不同。确保仔细阅读OpenCV官方文档中的交叉编译部分,以获取更多详细信息和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_20312079

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值