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

news2025/1/12 9:00:40

文章目录

  • 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}-gcc
      TARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-g++
#!/bin/bash
################################################################################
if [ $NEUWARE_HOME ] ;then
  echo "NEUWARE_HOME: ${NEUWARE_HOME} has been set."
else
  export NEUWARE_HOME="/usr/local/neuware"
  echo "set NEUWARE_HOME: ${NEUWARE_HOME} by default."
fi

BUILD_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 ]; then
  while [ $# != 0 ]; do
    case "$1" in
      --cpu-arch=*)
          TMP_STRING=$1
          TARGET_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
          ;;
    esac
  done
fi

## TOOLCHAIN_ROOT not exist, use default env
if [ ! "${TOOLCHAIN_ROOT}" ]; then
  if [ "$TARGET_CPU_ARCH" == "aarch64-linux-gnu" ]; then
    if [ "$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"
    else
      TOOLCHAIN_ROOT="/tmp/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu"
    fi
    echo "Using default TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}"
    if [ -f ${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc ]; then
      TARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc
      TARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-g++
    else
      TARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-gcc
      TARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-g++
    fi
  fi
else
  echo "Using TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}"
  if [ "$TARGET_CPU_ARCH" == "aarch64-linux-gnu" ]; then
    if [ -f ${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc ]; then
      TARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc
      TARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-g++
    else
      TARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-gcc
      TARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-g++
    fi
  fi
fi

if [[ -f /proc/cpuinfo ]]; then
    MJOBS=$(grep -c processor /proc/cpuinfo)
else
    MJOBS=4
fi

pushd ${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_rel


if [ $NEUWARE_HOME ] ;then
  echo "NEUWARE_HOME: ${NEUWARE_HOME} has been set."
else
  export NEUWARE_HOME="/usr/local/neuware"
  echo "set NEUWARE_HOME: ${NEUWARE_HOME} by default."
fi



BUILD_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 ]; then
  while [ $# != 0 ]; do
    case "$1" in
      --cpu-arch=*)
          TMP_STRING=$1
          TARGET_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
          ;;
    esac
  done
fi

## TOOLCHAIN_ROOT not exist, use default env
if [ ! "${TOOLCHAIN_ROOT}" ]; then
  if [ "$TARGET_CPU_ARCH" == "aarch64-linux-gnu" ]; then
    if [ "$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"
    else
      TOOLCHAIN_ROOT="/tmp/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu"
    fi
    echo "Using default TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}"
    if [ -f ${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc ]; then
      TARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc
      TARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-g++
    else
      TARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-gcc
      TARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-g++
    fi
  fi
else
  echo "Using TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}"
  if [ "$TARGET_CPU_ARCH" == "aarch64-linux-gnu" ]; then
    if [ -f ${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc ]; then
      TARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-gcc
      TARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/${TARGET_CPU_ARCH}-g++
    else
      TARGET_C_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-gcc
      TARGET_CXX_COMPILER=${TOOLCHAIN_ROOT}/bin/aarch64-linux-g++
    fi
  fi
fi

if [[ -f /proc/cpuinfo ]]; then
    MJOBS=$(grep -c processor /proc/cpuinfo)
else
    MJOBS=4
fi

pushd ${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.coloradmin.cn/o/1203464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gStore入选BenchCouncil年度世界开源系统杰出成果

“只以贡献分高下” BenchCouncil&#xff08;国际测试委员会&#xff09; 邀请了多位独立科学家 从2022至2023年度数万项开源相关成果中 遴选出了102项代表性成果 在确定主要贡献者的基础上 产生了开源领域 年度人才榜、机构榜、国家榜 共195人进入榜单 中国在“开源…

Marin说PCB之 PCB封装和原理图封装的藕断丝连

最近天气开始降温了&#xff0c;小编我不得不拿出珍藏多年的秋裤穿上了&#xff0c;就是走路不太方便&#xff0c;有点紧啊&#xff0c;可能是当时衣服尺码买小了吧&#xff0c;不可能是我吃胖了&#xff0c;这个绝对不可能。 话说小编我今年属实有点走霉运啊&#xff0c;下班和…

Camtasia2024全新中文版电脑录屏工具

在这个视频的大舞台上&#xff0c;每一帧都是你炫耀的机会&#xff0c;每一秒都是让观众瞪大眼睛的瞬间。现在&#xff0c;让我们一起飞跃时空&#xff0c;用更少的时间创作更多的惊喜吧&#xff01; 就算你是个小白&#xff0c;毫无经验&#xff0c;别担心&#xff0c;Camtas…

Jmeter添加变量的四种方法

一、在样本中添加同请求一起发送的参数。根据服务器设置的数据类型&#xff0c;来添加不同类型的参数 二、用户定义的变量 1、创建&#xff1a;添加->配置元件->用户定义的变量 2、作用&#xff1a;当前的线程组内所有Sampler都可以引用变量&#xff0c;方便脚本更新&a…

2023年阿里云服务器最新日常价、活动价格、可使用优惠券金额及券后价格参考

阿里云服务器最新实际购买价格参考&#xff0c;轻量应用服务器2核2G3M带宽配置日常价720.00元/1年&#xff0c;最新活动价格为87元/1年&#xff0c;订单满300元以上即可使用满减优惠券&#xff0c;例如经济型e实例2核4G2M带宽日常价格为1802.40元&#xff0c;最新的活动价格为8…

从GPT定制到Turbo升级再到Assistants API,未来AI世界,你准备好了吗?

引言 在OpenAI DevDay发布会上&#xff0c;OpenAI再次震撼整个人工智能行业&#xff0c;为AI领域带来了重大的更新。CEO Sam Altman宣布推出了定制版本的ChatGPT&#xff0c;这意味着用户现在可以根据自己的需求打造个性化的GPT&#xff0c;并分享至GPT Store。这一消息对于受A…

C++网络编程库编写自动爬虫程序

首先&#xff0c;我们需要使用 C 的网络编程库来编写这个爬虫程序。以下是一个简单的示例&#xff1a; #include <iostream> #include <string> #include <curl/curl.h> #include <openssl/ssl.h>const char* proxy_host "duoip"; const in…

sd-wan网速测试:如何测试sd-wan网速?

SD-WAN是一种新兴的网络技术&#xff0c;可以显著提高企业的网络连接速度和性能。在当今的数字时代&#xff0c; 网络连接的质量对企业的运营至关重要。因此&#xff0c;sd-wan的网络速度测试尤为重要。 在进行sd-wan网速测试之前&#xff0c;我们首先需要知道什么是sd-wan-wa…

二十七、W5100S/W5500+RP2040树莓派Pico<iperf 测速示例>

文章目录 1 前言2 简介2 .1 什么是网络测速技术&#xff1f;2.2 网络测速技术的优点2.3 网络测速技术数据交互原理2.4 网络测速应用场景 3 WIZnet以太网芯片4 示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言…

全国不同级别高炉炼铁主要操作指标与分析

参考网址&#xff1a;https://www.zgltw.cn/liantiexinjishu/2020/0114/23584.html &#xff08;中国炼铁网&#xff09; 参考网址&#xff1a;https://www.zgltw.cn/liantiexinjishu/2020/0114/23584.html &#xff08;中国炼铁网 世界金属导报&#xff09;

Verilog基础:三段式状态机与输出寄存

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html 对于Verilog HDL而言&#xff0c;有限状态机(FSM)是一种重要而强大的模块&#xff0c;常见的有限状态机书写方式可以分为一段式&#xff0c;二段式和三段式&#xff0c;笔者强烈建议使用三…

JAVA弑神大阵之装饰者大阵

架构说明 构成简述&#xff1a; 总接口&#xff1a; 装饰者跟被装饰者都要来实现他&#xff08;或者理解成父接口&#xff09;&#xff0c;作用&#xff1a;对被装饰者做转换 被装饰者&#xff1a; 此处实现总接口。什么都不需要动&#xff0c;他只是被增强的功能&#xff0…

【ArcGIS Pro微课1000例】0030:ArcGIS Pro中自带晕渲地貌工具的妙用

在ArcGIS中,制作地貌晕渲效果通常的做法是先制作山体阴影效果,然后叠加在DEM的下面,再改变DEM的透明度来实现。而在ArcGIS Pro中自带了效果显著的晕渲地貌工具。 文章目录 一、晕渲地貌工具1. 符号系统2. 栅格函数二、山体阴影效果1. 工具箱2. 栅格函数打开ArcGIS Pro3.0,加…

监控和数据采集软件架构和详细设计

介绍 监控和数据采集软件通过提供实时监控、数据收集和分析功能&#xff0c;在各个行业中发挥着至关重要的作用。这些软件应用程序可帮助企业收集有价值的见解、优化流程并做出明智的决策。在本文中&#xff0c;我们将探讨监测和数据采集软件的软件架构、编程技术和详细设计规范…

『亚马逊云科技产品测评』活动征文|搭建带有“弱”图像处理功能的流媒体服务器

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 本文基于以下软硬件工具&#xff1a; aws ec2 frp-0.52.3 mediamtx-1.3…

链动2+1模式系统开发之区域代理深度解析

区域代理的保护机制&#xff1a;在链动商城系统里设定的代理有唯一性&#xff0c;每个省只有一个省代&#xff0c;每个市只有一个市代&#xff0c;每个区县只有一个区县代。这样也是保护每个代理的收益权益。 区域代理包含的权益类别&#xff1a;购物奖励折扣&#xff1b;区域实…

iOS群控手机App的开发难点是什么?

随着智能手机的普及&#xff0c;手机App已经成为我们生活中不可或缺的一部分&#xff0c;在众多手机操作系统中&#xff0c;iOS系统因其封闭性、安全性和流畅性而备受用户青睐&#xff0c;然而&#xff0c;开发一款针对iOS系统的手机App却并非易事。 一、开发语言与框架 iOS系…

Antv/G2 折线图 使用 DataSet 进行数据排序

DataSet 文档 G2 3.2 DataSet 文档 安装 浏览器引入 可以通过 <script> 标签引入在线资源或者本地脚本&#xff1a; <!-- 引入在线资源 --> <script src"https://unpkg.com/antv/data-set"></script><!-- 引入本地脚本 --> <sc…

解决pikachu中RCE中文乱码的问题

这个问题我在DVWA中的RCE栏目同样遇到过&#xff0c;今天在做pikachu的RCE的时候也遇到了&#xff0c;所以特此来解决一下这个问题&#xff0c;解决方法很简单&#xff0c;在源码中加入下一行代码。 $result iconv("GBK", "UTF-8", $result);加在68行前面…

虚拟仪器软件结构VISA

1、什么是VISA VISA是虚拟仪器软件结构(Virtual Instrument Software Architectuere)的简称&#xff0c;是由VXI plug & play系统联盟所统一制定的I/O接口软件标准及其相关规范的总称。一般称这个I/O函数库为VISA库&#xff08;用于仪器编程的标准I/O函数库&#xff09;。…