【寒武纪(10)】linux arm aarch 是 opencv 交叉编译与使用

news2025/1/10 20:57:27

文章目录

  • 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/1232469.html

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

相关文章

NX二次开发UF_CAM_ask_opt_template_object 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_opt_template_object Defined in: uf_cam.h int UF_CAM_ask_opt_template_object(UF_CAM_opt_t * opt_object ) overview 概述 This function provides the object which is used to in…

Python如何将项目直接打包为一键整合包

目录 一、准备项目 二、创建打包文件 三、创建安装脚本 四、执行安装 五、测试安装 六、常见问题与解决方案 总结 Python项目打包成一键整合包是一个比较复杂的任务&#xff0c;需要考虑到项目的各个方面&#xff0c;包括依赖项、配置文件、静态文件、数据库等等。下面是…

澳洲猫罐头如何?我亲自喂养过的优质猫罐头分享

猫罐头要符合三点&#xff1a;营养配方完整均衡、原料新鲜优质、生产工艺科学可靠。只有具备这些特点&#xff0c;才是品质上乘的猫罐头。 猫罐头的三个要素&#xff0c;一个都不能少。配方不均衡&#xff0c;营养就不足&#xff1b;原料不新鲜&#xff0c;生产出来的猫罐头就…

计算机毕业设计python企业员工人事管理系统vue

管理员&#xff1a; 1.员工资料管理&#xff1a;查看员工列表&#xff0c;添加职工&#xff0c;修改信息&#xff08;搜索员工使用模糊查询&#xff09; 2.部门管理&#xff1a;查看部门列表&#xff0c;修改信息&#xff0c;添加新部门 3.职工考勤管理&#xff1a;添加&#x…

vue3-响应式核心

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-响应式核心 响应式核心 目录 响应式核心 3.1ref() 3.2computed () 3.3 reactive() 3.4 …

[C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

SAP创建权限对象、角色、并分配角色

一、SU20&#xff1a;维护权限字段 二、SU21创建权限对象,分配权限字段: 三、SU24关联程序和自建权限对象&#xff08;标准tcode会默认存在标准权限对象&#xff09; 四、PFCG创建角色 五、SU01给用户分配角色 一、su20&#xff1a;维护权限字段 X点新建&#xff1a; 填入…

智慧化工园区信息化整体解决方案:PPT全53页,附下载

关键词&#xff1a;智慧化工园区建设方案&#xff0c;智慧化工园区建设规范&#xff0c;智慧化工园区建设指南 一、售智慧化工园区建设背景 随着工业化、信息化和数字化进程的加速&#xff0c;化工园区面临着越来越多的挑战&#xff0c;如安全生产、环境保护、能源消耗等问题…

NX二次开发UF_CAM_ask_post_template_name 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_post_template_name Defined in: uf_cam.h int UF_CAM_ask_post_template_name(const char * * post_template_filename ) overview 概述 This function provides the name of the file…

EtherCAT从站EEPROM分类附加信息详解:RXPDO(输入过程数据对象)

0 工具准备 1.EtherCAT从站EEPROM数据(本文使用DE3E-556步进电机驱动器)1 分类附加信息——RXPDO(输入过程数据对象) 1.1 分类附加信息规范 在EEPROM字64开始的区域存储的是分类附加信息,这里存储了包括设备信息、SM配置、FMMU配置在内的诸多信息。每个信息在一段连续的…

全球地表水年度数据集JRC Yearly Water Classification History, v1.4数据集

简介&#xff1a; JRC Yearly Water Classification History, v1.4是一个对全球水资源进行分类的数据集&#xff0c;覆盖了1984年至2019年的时间范围。该数据集是由欧盟联合研究中心&#xff08;JRC&#xff09;开发的&#xff0c;使用的数据源是来自Landsat系列卫星的高分辨率…

NX二次开发UF_CAM_ask_tool_matl_db_object 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_tool_matl_db_object Defined in: uf_cam.h int UF_CAM_ask_tool_matl_db_object(UF_CAM_db_object_t * db_obj ) overview 概述 This function provides the database object which is…

Ubuntu本地快速搭建web小游戏网站,公网用户远程访问

前言 网&#xff1a;我们通常说的是互联网&#xff1b;站&#xff1a;可以理解成在互联网上的一个房子。把互联网看做一个城市&#xff0c;城市里面的每一个房子就是一个站点&#xff0c;房子里面放着你的资源&#xff0c;那如果有人想要访问你房子里面的东西怎么办&#xff1…

BUUCTF 菜刀666 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 流量分析&#xff0c;你能找到flag吗 注意&#xff1a;得到的 flag 请包上 flag{} 提交 密文&#xff1a; 下载附件&#xff0c;解压得到一个.pcapng文件。 解题思路&#xff1a; 1、双击文件&#xff0c;打开wir…

C语言——I /深入理解指针(一)

一、内存和地址 1byte&#xff08;字节&#xff09; 8bit&#xff08;比特位&#xff09; 1KB 1024byte 1MB 1024KB 1GB 1024MB 1TB 1024GB 1PB 1024TB一个比特位可以存放二进制的0/1的一位 ⽣活中我们把⻔牌号也叫地址&#xff0c;在计算机中我们把内存单元的编号也称为…

初步设计报告(框架)

前言 &#xff08;简述初步设计报告编制的背景、过程及其它有关情况&#xff09;&#xff08;内容可根据项目的实际建设内容进行选择&#xff09; 编制单位资质证明

DBS note3:B+ Trees

目录 1、介绍 2、B树特征 3、插入 4、删除 5、存储记录 1&#xff09;方法1&#xff1a;按值存储 2&#xff09;方法2&#xff1a;按引用存储 3&#xff09;方法3&#xff1a;按引用列表存储 6、聚类&#xff08;Clustering&#xff09; 1&#xff09;非聚类&#xff…

在 OpenCV 中使用 ChArUco 棋盘

TLDR&#xff1a;目前在线的许多 Charuco 示例代码都已过时&#xff0c;并且会让你出错。如果 ChatGPT 或 Stack Exchange 建议你使用&#xff1a;cv2.aruco.CharucoBoard_create(length, width, ...)你会发现正确的语法是 cv2.aruco.CharucoBoard((length, width), ...)。希望…

vs code git问题:文件明明已加入忽略文件中,还是出现

vs code git问题&#xff1a;文件明明已加入忽略文件中&#xff0c;还是出现 原因&#xff1a; 因为之前这些文件都已经提交过&#xff0c;线上GIT已经存在&#xff0c;已存在就不能忽略&#xff0c; 解决办法&#xff1a; 先要删除这些文件提交上去&#xff0c;然后把这些文…

【Rust 日报】2023-11-19 solars:可视化太阳系

eyre 0.6.9发布 Eyre是一个可定制的应用程序错误报告库&#xff0c;通过诸如tracing等集成&#xff0c;允许进行可配置的格式化和上下文聚合。本次更新如下。 组织一个由共同决策驱动的异步维护团队。添加一个贡献指南。修复在丢弃已抹除的错误报告时发生的堆叠借用违规。修复由…