【OpenCV(3)】linux arm aarch 是 opencv 交叉编译与使用

文章目录

  • 1、直接找github 别人编译好的
  • 2、自主编译
    • 参考
  • 3使用
  • CMake
    • 检查
  • 参考

1、直接找github 别人编译好的

测试很多,找到一个可用的。

https://github.com/dog-qiuqiu/libopencv

它用了超级模块!
OpenCV的world模块也称为超级模块(super-module),它结合了用户选择的所有其它模块。在编译OpenCV库时,有需要勾选BUILD_opencv_world模块,其作用是将所有模块的库文件合并成一个大的库文件,方便在链接时候的操作。

这样就不用自主编译了。但是已经自主编译了一个,还是记录下吧。

2、自主编译

找了很多github的编译好的文件,都没法用。还是自己编译吧。

opencv的交叉编译工具链在…/opencv3.4.16/platforms/linux 路径下,linux文件夹下是一些.cmake文件,对应不同的移植对象,本人需要在NVIDIA的Xavier部署模型,所以选择aarch64-gnu.toolchain.cmake 工具链。在opencv3.4.16目录下,编写build.sh文件,然后执行./build.sh --mlu-arch=SD5223C --cpu-arch=aarch64。 具体的buld.sh 这样写

这个脚本只有2个地方需要修改:

  • 如果你的交叉编译器的地址修改,第53行 TOOLCHAIN_ROOT="/tmp/aarch64--glibc--stable-2020.08-1"
  • TARGET_C_COMPILERTARGET_CXX_COMPILER地址,需要注意。其他地方都很好理解。如果不理解,请在评论区讨论。
      TARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gccTARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-g++
#!/bin/bash
################################################################################
if [ $NEUWARE_HOME ] ;thenecho "NEUWARE_HOME: ${NEUWARE_HOME} has been set."
elseexport NEUWARE_HOME="/usr/local/neuware"echo "set NEUWARE_HOME: ${NEUWARE_HOME} by default."
fiBUILD_DIR="build"
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"BUILD_MODE="release"
MLU_ARCH=""
TARGET_CPU_ARCH="x86_64-linux-gnu"
TARGET_C_COMPILER="$(which gcc)"
TARGET_CXX_COMPILER="$(which g++)"
if [ $# != 0 ]; thenwhile [ $# != 0 ]; docase "$1" in--cpu-arch=*)TMP_STRING=$1TARGET_CPU_ARCH=${TMP_STRING#*=};TARGET_CPU_ARCH=${TARGET_CPU_ARCH}-linux-gnu;shift;;--mlu-arch=*)TMP_MLU_ARCH=${1}MLU_ARCH=${TMP_MLU_ARCH#*=}shift;;-d | --debug)BUILD_MODE="debug"echo "-- Using debug mode."shift;;-v | --verbose)BUILD_VERBOSE="VERBOSE=1"shift;;esacdone
fi## TOOLCHAIN_ROOT not exist, use default env
if [ ! "${TOOLCHAIN_ROOT}" ]; thenif [ "$TARGET_CPU_ARCH" == "aarch64-linux-gnu" ]; thenif [ "$MLU_ARCH" == "SD5223" ]; then#TOOLCHAIN_ROOT="/tools/gcc/gcc-9/gcc-stable-9.3.0-2020.08-x86_64_aarch4-linux-gnu"TOOLCHAIN_ROOT="/tools/gcc/gcc-9/gcc-stable-9.3.0-2020.08-x86_64_aarch4-linux-gnu"elseTOOLCHAIN_ROOT="/tmp/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu"fiecho "Using default TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}"if [ -f ${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc ]; thenTARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gccTARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-g++elseTARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-gccTARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-g++fifi
elseecho "Using TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}"if [ "$TARGET_CPU_ARCH" == "aarch64-linux-gnu" ]; thenif [ -f ${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc ]; thenTARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gccTARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-g++elseTARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-gccTARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-g++fifi
fiif [[ -f /proc/cpuinfo ]]; thenMJOBS=$(grep -c processor /proc/cpuinfo)
elseMJOBS=4
fipushd ${BUILD_DIR}cmake -DCMAKE_BUILD_TYPE="${BUILD_MODE}" \-DTOOLCHAIN_ROOT="${TOOLCHAIN_ROOT}" \-DTARGET_CPU_ARCH="${TARGET_CPU_ARCH}" \-DCMAKE_C_COMPILER="${TARGET_C_COMPILER}" \-DCMAKE_CXX_COMPILER="${TARGET_CXX_COMPILER}" \-DMLU_ARCH="${MLU_ARCH}" \-DCMAKE_INSTALL_PREFIX=../aarch_64_install \-DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake \..make -j$MJOBS ${BUILD_VERBOSE}
popd

这个脚本还是很好用的,如果理解里面的知识点的话!!

make install

编译结束后进入aarch_64_install文件夹,里面生成bin,include,lib,share四个文件夹。

在这里插入图片描述

参考

https://zhuanlan.zhihu.com/p/381760569

3使用

可以直接通过指定export OPENCV_DIR=xxx指定依赖的opencv,默认需要的组织目录(aarch64架构下建议使用该种形式):

|-- ${OPENCV_DIR}|   |-- include|   |   |-- opencv2|   |-- lib|   |   |-- libxxx

CMake

# cmake file for samples
cmake_minimum_required(VERSION 2.8)
project(SAMPLES)
set(CMAKE_CXX_STANDARD 11)  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/bin")
set(TOOLCHAIN_ROOT ${TOOLCHAIN_ROOT})
set(TARGET_CPU_ARCH ${TARGET_CPU_ARCH})
if(${TARGET_CPU_ARCH} MATCHES "aarch64-linux-gnu")include_directories(${TOOLCHAIN_ROOT}/aarch64-linux-gnu/include/c++/6.2.1/)include_directories(${TOOLCHAIN_ROOT}/aarch64-linux-gnu/include/c++/6.2.1/aarch64-linux-gnu/)include_directories(${TOOLCHAIN_ROOT}/aarch64-linux-gnu/)
endif()################################################################################
# opencv lib
################################################################################if(NOT HAVE_OPENCV)if("$ENV{OPENCV_DIR}" STREQUAL "")find_package(OpenCV REQUIRED)set(HAVE_OPENCV true)message("find_package(OpenCV REQUIRED)   required.")else()message("find_package(OpenCV REQUIRED)   No!")include_directories("$ENV{OPENCV_DIR}/include")link_directories("$ENV{OPENCV_DIR}/lib")set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs)set(HAVE_OPENCV true)endif()
endif()if(NOT HAVE_OPENCV)message(FATAL_ERROR "Cannot find opencv which is required.")
else()#message(${OpenCV_INCLUDE_DIRS})message("ok  required.")
endif()
include_directories( ${OpenCV_INCLUDE_DIRS} )set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC -Wall -Werror -pthread")
message(STATUS "Project: ${PROJECT_SOURCE_DIR}" )
message(STATUS "Project SOURCE dir: ${SAMPLES_SOURCE_DIR}" )
message(STATUS "Project BINARY dir: ${PROJECT_BINARY_DIR}" )function(gensample sample_file)set(sample_root_name ${CMAKE_CURRENT_SOURCE_DIR}/${sample_file}.cpp)add_executable(sample_${sample_file} ${sample_root_name} )target_link_libraries(sample_${sample_file}  ${OpenCV_LIBS})
endfunction()################################################################################
# Build Samples
################################################################################
set(MLU_ARCH)if ("${MLU_ARCH}" MATCHES "SD5223")gensample(OpenCVTest)
else()gensample(OpenCVTest)
endif()
#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"int main()
{cv::Mat srcImage = cv::imread("1.jpg");cv::Mat img;cv::cvtColor(srcImage, img, cv::COLOR_BGR2RGB);//cv::imwrite("resize_input.jpg", srcImage);cv::imwrite("resize_input.jpg", img);//cv::Mat img;cv::cvtColor(srcImage, img, cv::COLOR_BGR2RGB);cv::imshow("源图像",srcImage);cv::waitKey(0);return 0;
}

sh脚本

#!/bin/bash
################################################################################
export OPENCV_DIR=/mnt/ef2301-sdk-0.10.0/board/develop_workspace/inference/OpenCV3.0.0-master/arm-obj_relif [ $NEUWARE_HOME ] ;thenecho "NEUWARE_HOME: ${NEUWARE_HOME} has been set."
elseexport NEUWARE_HOME="/usr/local/neuware"echo "set NEUWARE_HOME: ${NEUWARE_HOME} by default."
fiBUILD_DIR="build"
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"BUILD_MODE="release"
MLU_ARCH=""
TARGET_CPU_ARCH="x86_64-linux-gnu"
TARGET_C_COMPILER="$(which gcc)"
TARGET_CXX_COMPILER="$(which g++)"
if [ $# != 0 ]; thenwhile [ $# != 0 ]; docase "$1" in--cpu-arch=*)TMP_STRING=$1TARGET_CPU_ARCH=${TMP_STRING#*=};TARGET_CPU_ARCH=${TARGET_CPU_ARCH}-linux-gnu;shift;;--mlu-arch=*)TMP_MLU_ARCH=${1}MLU_ARCH=${TMP_MLU_ARCH#*=}shift;;-d | --debug)BUILD_MODE="debug"echo "-- Using debug mode."shift;;-v | --verbose)BUILD_VERBOSE="VERBOSE=1"shift;;esacdone
fi## TOOLCHAIN_ROOT not exist, use default env
if [ ! "${TOOLCHAIN_ROOT}" ]; thenif [ "$TARGET_CPU_ARCH" == "aarch64-linux-gnu" ]; thenif [ "$MLU_ARCH" == "SD5223" ]; then#TOOLCHAIN_ROOT="/tools/gcc/gcc-9/gcc-stable-9.3.0-2020.08-x86_64_aarch4-linux-gnu"TOOLCHAIN_ROOT="/tools/gcc/gcc-9/gcc-stable-9.3.0-2020.08-x86_64_aarch4-linux-gnu"elseTOOLCHAIN_ROOT="/tmp/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu"fiecho "Using default TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}"if [ -f ${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc ]; thenTARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gccTARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-g++elseTARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-gccTARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-g++fifi
elseecho "Using TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}"if [ "$TARGET_CPU_ARCH" == "aarch64-linux-gnu" ]; thenif [ -f ${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc ]; thenTARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gccTARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-g++elseTARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-gccTARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-g++fifi
fiif [[ -f /proc/cpuinfo ]]; thenMJOBS=$(grep -c processor /proc/cpuinfo)
elseMJOBS=4
fipushd ${BUILD_DIR}cmake -DCMAKE_BUILD_TYPE="${BUILD_MODE}" \-DTOOLCHAIN_ROOT="${TOOLCHAIN_ROOT}" \-DTARGET_CPU_ARCH="${TARGET_CPU_ARCH}" \-DCMAKE_C_COMPILER="${TARGET_C_COMPILER}" \-DCMAKE_CXX_COMPILER="${TARGET_CXX_COMPILER}" \-DMLU_ARCH="${MLU_ARCH}" \..make -j$MJOBS ${BUILD_VERBOSE}
popd

检查

利用file draw_image检查可执行文件格式是否支持arrch64

draw_image: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=42f4ae7c66a0875bc0d49e4195ff35aa08f15cbe, not stripped 

出现如上结果说明可执行文件支持ARM arrch64。

移植ARM端执行

将 aarch_64_install文件夹下的include和lib里的文件分别拷贝到ARM板的/usr/include 和/usr/lib下 然后打开终端执行可执行文件即可。

参考

https://blog.csdn.net/linxizi0622/article/details/128702048

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/192581.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NovelD: A Simple yet Effective Exploration Criterion论文笔记

NovelD:一种简单而有效的探索准则 1、Motivation 针对稀疏奖励环境下的智能体探索问题&#xff0c;许多工作中采用各种内在奖励(Intrinsic Reward)设计来指导困难探索环境中的探索 &#xff0c;例如&#xff1a; ICM&#xff1a;基于前向动力学模型的好奇心驱动探索RND&…

【Qt-23】Qt charts绘制曲线图

一、QChart简介 QChart是Qt中专门用于绘制图表的模块&#xff0c;支持折线图、柱状图、饼图等常见类型。其主要组成部分有&#xff1a; QChart&#xff1a;整个图表的容器&#xff0c;管理图表中的所有数据和图形属性QChartView&#xff1a;继承自QGraphicsView&#xff0c;用于…

小波神经网络的时间序列预测——短时交通流量预测

大家好&#xff0c;我是带我去滑雪&#xff01; 小波神经网络&#xff08;Wavelet Neural Network&#xff0c;WNN&#xff09;结合了小波变换和神经网络的特性&#xff0c;是一种在信号处理和模式识别领域应用广泛的神经网络模型。它的设计灵感来自于小波变换的多尺度分析特性…

解决k8s通过traefik暴露域名失败并报错:Connection Refused的问题

我敢说本篇文章是网上为数不多的解决traefik暴露域名失败问题的正确文章。 我看了网上太多讲述traefik夸夸其谈的文章了&#xff0c;包含一大堆复制粘贴的水文和还有什么所谓“阿里技术专家”的文章&#xff0c;讲的全都是错的&#xff01;基本没有一个能说到点子上去&#xf…

Istio学习笔记-部署模型

参考&#xff1a;Istioldie 1.18 / 部署模型 当您将 Istio 用于生产环境部署时&#xff0c;需要确定一系列的问题。 网格将被限制在单个集群中还是分布在多个集群中&#xff1f; 是将所有服务都放置在单个完全连接的网络中&#xff0c;还是需要网关来跨多个网络连接服务&#…

优秀智慧园区案例 - 新华三未来工厂制造园,园区业务创新及零碳升级

目录 一、新华三未来工厂制造园建设背景 二、未来工厂制造园总体设计思路 三、未来工厂制造园建设内容 四、关键技术及创新点 五、应用效益与推广 关键词&#xff1a;智慧园区解决方案&#xff0c;智慧园区建设总体方案&#xff0c;智慧园区建设规划方案&#xff0c;智慧园…

uniapp的实战总结大全

&#x1f642;博主&#xff1a;冰海恋雨 &#x1f642;文章核心&#xff1a;uniapp部分总结 目录 ​编辑 目录 前言&#xff1a; 解决方案 1. 跨平台开发 2. Vue.js生态 3. 组件库 4. 自定义组件 5. Native能力 6. 插件生态 7. 性能优化 写法 1. 模板&#xf…

PyCharm鼠标控制字体缩放

File->Settings->Keymap 右边搜索栏输入increase(放大)&#xff0c;可以看到下面出现increase Font Size(放大字体尺寸)&#xff0c;双击。 双击后出现几个选项&#xff0c;选择Add Mouse Shortcut,会出现一个页面给录入动作。 按住Ctrl同时鼠标向上滚动&#xff0c;该动…

【NLP】大型语言模型,ALBERT — 用于自监督学习的 Lite BERT

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

什么是OpenCL?

什么是OpenCL&#xff1f; 1.概述 OpenCL(Open Computing Language 开放计算语言)是一种开放的、免版税的标准&#xff0c;用于超级计算机、云服务器、个人计算机、移动设备和嵌入式平台中各种加速器的跨平台并行编程。OpenCL是由Khronos Group创建和管理的。OpenCL使应用程序…

为什么打开idea时,没有启动页面,如何解决?

更新idea2021.2后&#xff0c;当双击idea打开时&#xff0c;发现没有启动界面&#xff0c;直接进入IDEA界面&#xff0c;中间等待时间&#xff0c;让人误以为没有打开idea成功&#xff0c;使得多次点击idea图标。 解决方案就是 在idea界面菜单栏中找到帮助&#xff08;Help)&a…

(论文阅读32/100)Flowing convnets for human pose estimation in videos

32.文献阅读笔记 简介 题目 Flowing convnets for human pose estimation in videos 作者 Tomas Pfister, James Charles, and Andrew Zisserman, ICCV, 2015. 原文链接 https://arxiv.org/pdf/1506.02897.pdf 关键词 Human Pose Estimation in Videos 研究问题 视频…

挂耳式运动耳机哪个品牌好?5款公认好用的运动耳机推荐

​在现代社会&#xff0c;耳机已经成为了人们生活中必不可少的数码设备。在运动的时候&#xff0c;佩戴耳机更是成为了很多人的标配。但是&#xff0c;市面上的运动耳机种类繁多&#xff0c;如何选择一款适合自己的呢&#xff1f;今天我为大家挑选了5款公认好用的运动耳机&…

PyTorch技术和深度学习——四、神经网络训练与优化

文章目录 1.神经网络迭代概念1&#xff09;训练误差与泛化误差2&#xff09;训练集、验证集和测试集划分3&#xff09;偏差与方差 2.正则化方法1&#xff09;提前终止2&#xff09;L2正则化3&#xff09;Dropout 3.优化算法1&#xff09;梯度下降2&#xff09;Momentum算法3)RM…

​软考-高级-系统架构设计师教程(清华第2版)【第4章 信息安全技术基础知识(P160~189)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第4章 信息安全技术基础知识&#xff08;P160~189&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

LeetCode(10)跳跃游戏 II【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 45. 跳跃游戏 II 1.题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nu…

机器学习-搜索技术:从技术发展到应用实战的全面指南

在本文中&#xff0c;我们全面探讨了人工智能中搜索技术的发展&#xff0c;从基础算法如DFS和BFS&#xff0c;到高级搜索技术如CSP和优化问题的解决方案&#xff0c;进而探索了机器学习与搜索的融合&#xff0c;最后展望了未来的趋势和挑战&#xff0c;提供了对AI搜索技术深刻的…

表单提交是

首先&#xff0c;确保你已经安装了Vue 3、Element UI和axios&#xff08;用于发送HTTP请求&#xff09;。你可以使用以下命令进行安装&#xff1a; bash复制代码 npm install vuenext element-ui axios --save <template> <el-form :model"form" :rules&q…

Java Stream 的常用API

Java Stream 的常用API 遍历&#xff08;forEach&#xff09; package com.liudashuai;import java.util.ArrayList; import java.util.List;public class Test {public static void main(String[] args) {List<Person> userList new ArrayList<>();userList.ad…

可视化技术专栏100例教程导航帖—学习可视化技术的指南宝典

&#x1f389;&#x1f38a;&#x1f389; 你的技术旅程将在这里启航&#xff01; &#x1f680;&#x1f680; 本文专栏&#xff1a;可视化技术专栏100例 可视化技术专栏100例领略各种先进的可视化技术&#xff0c;包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章…