2021-08-05

Opencv3.4.14交叉编译AArch64(rk3399pro)

参考链接:https://blog.youkuaiyun.com/hunzhangzui9837/article/details/89846928

准备工作

环境:ubuntu18.04 64bit desktop (192.168.102.128) 
开发板:rk3399pro
交叉编译工具:gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar

编译步骤:

1.安装cmake和cmake-gui
sudo apt-get install camke cmake-gui cmake-qt-gui
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libgtk2.0-dev libjpeg-dev libpng-dev libtiff-dev 
2.配置交叉编译环境

sudo vim /etc/bash.bashrc

#set java env
export JAVA_HOME=/home/gaojun/devdisk/jdk1.8.0_281
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar:$CLASSPATH
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH

#set gcc env
export PATH=/home/gaojun/devdisk/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin:$PATH

3.编译opencv3.4.14

一)下载opencv3.4.14 官网地址:https://opencv.org/

二)解压进入该目录,新建build目录。

三)执行cmake-gui,配置选项。

  1. 选择opencv3.4.14的解压目录和build目录,如图:

第一处取名为Linux(区分大小写,错误5),不要取图上的名字,不然会出问题;

第二处为gcc交叉编译器;

第三处为g++交叉编译器;

第四处为交叉编译工具bin目录;

然后Finish,出现:

四)编译

在编译之前需要配置几项参数,避免报错。
1)修改build目录下的CMakeCache.txt
 sudo vim CMakeCache.txt
 
 在CMake_EXE_LINKER_FLAGS:STRING后面添加:-lpthread -lrt -ldl;如图:
 ![image](http://note.youdao.com/noteshare?id=7779019135633c4da5c230c99d9a3fda&sub=323CC667C6B3403291D1ACBFC4BB599F)
 

执行:

  sudo make
  sudo make install
4.碰到的问题
错误1:
error: #error "No suitable threading library available."
 
 #error "No suitable threading library available."
解决:

参考:https://blog.youkuaiyun.com/XHW___001/article/details/87377357

sudo gedit xx/xx/common.cc
添加:

#define HAVE_PTHREAD

错误2

can not be used when making a shared object; recompile with -fPIC
错误如图:

原因:

目前Linux OS系统会推出32位和64位两个不同的版本,由于32位程序和64位程序可能不兼容,因此如果在32bit OS环境下编译获得的库文件,移植入64bit环境时会产生Could not read symbols错误,一般是64 位 电脑才会出现。

参考:https://www.2cto.com/kf/201708/663543.html#

解决:

进入opencv目录下的3rdparty的对应目录CMakeFiles/ *.dir下,打开flags.make,在C_FLAGS = 后添加-O3 -fPIC用来支持在64位机上编译
如…/3rdparty/zlib/CMakeFiles/zlib.dir/flags.make
修改C_FLAGS =-W -Wall 为 C_FLAGS =-O3 -fPIC-W -Wall

修改CXX_FLAGS =-W -Wall 为 C_FLAGS =-O3 -fPIC-W -Wall

错误3

libopencv_imgcodecs.so:undefined reference to ‘png_init_filter_functions_neon’

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5narzTYG-1628133321899)(http://note.youdao.com/noteshare?id=f034bf242852800b68c8bf3434a2b958&sub=F5F3F802926C498FA4FE9CD40C62ABE6)]

解决:

修改
${HOME}/opencv-3.3.1/3rdparty/libpng/pngpriv.h

注释掉:

/*# if (defined(ARM_NEON) || defined(__ARM_NEON)) && */
修改为:

if defined(PNG_ARM_NEON) && (defined(ARM_NEON) || defined(__ARM_NEON)) && \

错误4(重要)

在编译时,始终不识别ant,如下图:
安装apache-ant-1.9.9
软链接 ln -s apache-ant-1.9.9/bin/ant /usr/bin/ant

软链接必须要做,否则无法识别ant。
直接安装ant,使用的是JDK11,导致运行出错。有时ant不识别,需要多刷几次。

错误5

libraries: …/…/lib/libopencv_features2d.so: cannot open shared object file: No such file or directory

解决:
Operating System 填写Linux (区分大小写)

这个数据可以使用Python进行解析和处理。可以按照以下步骤进行: 1. 将数据分割成每个数据项。 ``` data_items = data.split(',') ``` 2. 对于每个数据项,将其按#分割成四个小项,并存储到一个列表中。 ``` data_list = [] for item in data_items: item_list = item.split('#') data_list.append(item_list) ``` 3. 对于每个小项,进行相应的类型转换。 ``` for item in data_list: item[0] = int(item[0]) # 题号转换为整数 item[1] = datetime.datetime.strptime(item[1], '%Y-%m-%d %H:%M:%S') # 时间转换为datetime类型 if item[2] != '': # 操作类型转换为整数 item[2] = int(item[2]) item[3] = str(item[3]) # 科目转换为字符串类型 ``` 4. 可以按照需要对数据进行进一步处理,如按照题号、时间等进行排序、筛选等操作。 完整的Python代码如下: ``` import datetime data = '''1#2021-05-18 14:31:55##初级会计实务,2#2021-05-18 14:31:57#12#初级会计实务,2#2021-05-18 14:32:08##初级会计实务,3#2021-05-18 14:32:09#12#初级会计实务,4#2021-05-18 14:32:34#12#初级会计实务,4#2021-05-18 14:32:45##初级会计实务,5#2021-05-18 14:32:46#12#初级会计实务,5#2021-05-18 14:32:57##初级会计实务,6#2021-05-18 14:33:00#12#初级会计实务,7#2021-05-18 14:33:44#12#初级会计实务,7#2021-05-18 14:34:42##初级会计实务,8#2021-05-18 14:34:43#12''' # 将数据分割成每个数据项 data_items = data.split(',') # 对于每个数据项,将其按#分割成四个小项,并存储到一个列表中 data_list = [] for item in data_items: item_list = item.split('#') data_list.append(item_list) # 对于每个小项,进行相应的类型转换 for item in data_list: item[0] = int(item[0]) # 题号转换为整数 item[1] = datetime.datetime.strptime(item[1], '%Y-%m-%d %H:%M:%S') # 时间转换为datetime类型 if item[2] != '': # 操作类型转换为整数 item[2] = int(item[2]) item[3] = str(item[3]) # 科目转换为字符串类型 print(data_list) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值