【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.mzph.cn/news/140555.shtml

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

相关文章

Zeitgeist ZTG Token以及其预测市场加入Moonbeam生态

波卡上的首选多链开发平台Moonbeam宣布与Zeitgeist达成XCM集成&#xff0c;将ZTG Token引入Moonbeam。此集成将使波卡内的Moonbeam和Zeitgeist网络之间的流动性得以流动&#xff0c;并通过Moonbeam的互连合约实现远程链集成。 Zeitgeist是一个基于波卡的Substrate区块链框架构…

5个最佳开源RPA框架

在最近两年中&#xff0c;RPA加上AI&#xff0c;即智能自动化流程&#xff0c;已经成为频繁讨论的话题&#xff0c;特别是在企业和机构的数字化转型过程中。自动化与智能化成为了提高效率的关键手段&#xff0c;而RPA便是迈向这一未来的起始步骤。 可以将RPA视为人体的躯干神经…

[MySQL] MySQL库的基础操作

文章目录 一、数据库的创建 1、1 库的创建 1、2 字符集与校验规则 1、2、1 查看字符集与校验规则 1、2、2 字符集与校验规则的设置 1、2、3 校验规则对数据库的影响 二、数据库的操作 2、1 查看数据库 2、2 删除数据库 2、3 修该数据库 2、4 数据库删除和备份 2、5 显示创建语…

C#医学检验室(LIS)信息管理系统源码

LIS:实验室信息管理系统 (Laboratory Information Management System简称:LIS)。 LIS 是面向医院检验科、检验中心、动物实验所、生物医疗研究所等科研单位研发的集数据采集、传输、存储、分析、处理、发布等功能于一体的信息管理系统。 一、完善的质控&#xff1a; 从样本管理…

芯片设计工程师必备基本功——《设计与验证:Verilog HDL》

Verilog HDL 作为两大硬件描述语言之一&#xff0c;拥有很大的用户群。据调查&#xff0c;目前美国有 90%左右的 IC 设计人员使用 Verilog. 在中国&#xff0c;大概再 50% 左右的人在使用 Verilog 。 大量高校毕业生和部分软件设计人员正在不断涌入这个领域。要想尽快在 IC设计…

Python开源项目CodeFormer——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片&#xff0c;免不了有些是黑白的、被污损的、模糊的&#xff0c;总想着修复一下。作为一个程序员 或者 程序员的家属&#xff0c;当然都有责任满足他们的需求、实现他们的想法。除了这个&#xff0c;学习了本文的成果&#xff0c;或许你还…

git02->gui图形化界面使用,ssh协议,idea集成GIT

gui图形化界面使用ssh协议idea集成GIT 1.gui图形化界面使用 2.ssh协议 git/github生成密钥并通过 操作分为本地电脑配置和github网站配置 第一步&#xff1a;本地电脑配置 右键空白处&#xff0c;选择Git Bash Here打开相关命令窗口 1.配置用户名和邮箱&#xff08;如果已经配…

node插件MongoDB(三)—— 库mongoose 的使用和数据类型(一)

前言 提示&#xff1a;使用mongoose 的前提是你安装了node和 MongoDB。 mongoose 官网文档&#xff1a;http://mongoosejs.net/docs/index.html 文章目录 前言一、安装二、基本使用1. 打开bin目录的mongod.exe文件2. 基本使用的代码&#xff08;连接mongodb 服务&#xff09;3.…

基于《环境影响评价技术导则大气环境(HJ 2.2-2018)》的AERMOD模型配置方法

数值模式模拟是分析大气污染物时空分布和成分贡献的重要工具&#xff0c;利用模拟结果可以分析大气污染的来源、成因、污染程度、持续时间、主要成分、相对贡献等问题&#xff0c;有助于分析并合理控制污染源排放&#xff0c;为产业调整提供参考。当前&#xff0c;针对不同理论…

海思平台awb标定

文章目录 1、raw图采集2、awb标定3、标定效果优化1、raw图采集 raw图采集标准: 如果raw是12bit,即raw12,那么Block9 块的亮度就是40960.8 = 3276.8左右。 勾上Dump Raw,我这里raw10,即Depth为10bit,那么Block19的亮度应该为10240.8 = 819.2左右,调整曝光Exposure Attr…

LED显示屏老化知识

LED显示屏老化是指长时间使用后&#xff0c;LED显示屏性能逐渐下降和衰减的过程。虽然LED显示屏具有较长的寿命和良好的稳定性&#xff0c;但长期使用和环境因素会导致一定程度的老化现象。 LED显示屏为什么会老化 1. 亮度衰减&#xff1a;LED显示屏使用时间越长&#xff0c;LE…

蓝桥杯 选择排序

选择排序的思想 选择排序的思想和冒泡排序类似&#xff0c;是每次找出最大的然后直接放到右边对应位置&#xff0c;然后将最 右边这个确定下来&#xff08;而不是一个一个地交换过去&#xff09;。 再来确定第二大的&#xff0c;再确定第三大的… 对于数组a[]&#xff0c;具体…

keras转onnx,TensorFlow转tf.keras.models.load_model,onnx精度转换

参考&#xff1a; https://blog.csdn.net/Deaohst/article/details/126864267 转onnx 别直接转onnx。 先转PB&#xff1a; import tensorflow as tfmodel_path ./models/model.h5 # 模型文件 model tf.keras.models.load_model(model_path) model.sa…

深入了解springmvc响应数据

目录 一、前后端分离开发与混合开发 1.1 混合开发模式 1.2 前后端分离模式【重点】 二、页面跳转控制 2.1 通过JSP实现页面跳转 2.2 转发与重定向 三、返回JSON数据 3.1 导包与配置 3.2 使用ResponseBody 四、返回静态资源 4.1 为什么无法直接查询静态资源 4.2 配置…

应用在便携式多媒体播放器中的音频Codec芯片

便携式多媒体播放器(PMP&#xff0c;Portable Media Player)&#xff0c;也就是通常人们所说的MP4。PMP的主要优点是&#xff1a;携带方便&#xff0c;能够直接播放高品质音/视频文件&#xff1b;也可以浏览图片&#xff0c;以及作为移动硬盘使用&#xff1b;此外&#xff0c;P…

使用matlab实现图像信号的色彩空间转换

利用matlab对图像信号进行读取&#xff0c;并对RGB空间进行转换&#xff0c;如转换到HSI空间等。 下面的这个代码是在使用了rgb2hsi()方法失败后&#xff0c;进行修改的。 rgb2hsi(img)这个方法可以将RGB图像转换为HIS图像&#xff1b;但是爆出了 Untitled5(line 5)hsi rgb2h…

Facebook广告被暂停是什么原因?Facebook广告账号被封怎么办?

许多做海外广告投放的小伙伴经常遇到一个难题&#xff0c;那就是投放的Facebook广告被拒或 Facebook 广告帐户被关闭赞停的经历&#xff0c;随之而来的更可能是广告账户被封&#xff0c;导致资金的损失。本文将从我自身经验&#xff0c;为大家分享&#xff0c;Facebook广告被暂…

哈希竞猜游戏开发源码部署方案

随着互联网技术的发展&#xff0c;越来越多的人开始关注网络安全问题&#xff0c;而哈希算法作为一种重要的加密技术&#xff0c;在网络安全领域得到了广泛应用。其中&#xff0c;哈希竞猜游戏作为一种新型的网络安全挑战赛&#xff0c;也受到了越来越多人的关注。本文将介绍哈…

ISP算法——UVNR

ISP算法——UVNR 概念简介 UVNR也就是经过CSC只有在YUV域对UV两个色域进行降噪&#xff0c;在有些方案里也叫CNR&#xff08;chroma noise reduction&#xff09;。主要就是在YUV域针对彩燥进行特殊处理的一系列算法。 关于噪声产生的原因在前面关于降噪的文章和视频中已经做…

Rust写的爬虫代码抓取精美的图片

Rust是一种系统级编程语言&#xff0c;它的设计目标是安全、并发和高效。Rust的爬虫库非常丰富&#xff0c;例如scraper、select、reqwest等等。这些库提供了许多功能&#xff0c;例如HTML解析、HTTP请求、异步处理等等&#xff0c;使得Rust成为一个非常适合编写爬虫的语言。 以…