opencv android 使用笔记

目录

获取app路径:

下载:OpenCV-android-sdk

cmakelist配置:

头文件路径:

编译报错:clang++: error: linker command failed with exit code 1 (use -v to see invocation)

读取图片例子

保存mp4 


获取app路径:

    public String getExternalPath() {
        File externalFilesDir = getExternalFilesDir(null);
        if (externalFilesDir != null) {
            return externalFilesDir.getAbsolutePath();
        } else {
            return null;
        }
    }

下载:OpenCV-android-sdk

下载地址:

在主页上点击github,

https://opencv.org/

https://github.com/opencv/opencv/releases

关于版本:4.9.0版本 是.a文件,在rknn下编译项目直接报错

opencv-4.8.0-android-sdk

cmakelist配置:

set(OpenCV_DIR D:/GZ/soft/rknn-toolkit2/rknn-toolkit2-master/rknpu2/examples/3rdparty/opencv/OpenCV-android-sdk/sdk/native/jni/abi-${CMAKE_ANDROID_ARCH_ABI})
find_package(OpenCV REQUIRED)
target_link_libraries( # Specifies the target library.
                       rknn4j
                       ${OpenCV_LIBS}

so文件不用自行添加引用了。

头文件路径:

OpenCV-android-sdk\sdk\native\jni\include\opencv2

adb push frame.jpg /data/RK3588/

编译报错:clang++: error: linker command failed with exit code 1 (use -v to see invocation)

点击 Build command failed,可以查看错误详细信息

C:/Users/Administrator/AppData/Local/Android/Sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: skipping incompatible D:/GZ/soft/rknn-toolkit2/rknn-toolkit2/rknpu2/examples/rknn_yolov5_android_apk_demo_o/app/src/main/jniLibs/arm64-v8a/libopencv_core.so when searching for -lopencv_core
C:/Users/Administrator/AppData/Local/Android/Sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find -lopencv_core

找不到-lopencv_core

原因:在cmakelist中直接加了so库

target_link_libraries( # Specifies the target library.
                       rknn4j
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_core.so
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_video.so
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_videoio.so

解决方法:把so去掉即可。

读取图片例子

#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"

  char *input_path="/data/RK3588/frame.jpg";
    cv::Mat orig_img = imread(input_path, cv::IMREAD_COLOR);

    // if origin model is from Caffe, you maybe not need do BGR2RGB.
    cv::Mat orig_img_rgb;
    cv::cvtColor(orig_img, orig_img_rgb, cv::COLOR_BGR2RGBA);

    cv::Mat cv_img = orig_img_rgb.clone();
    if (orig_img.cols != model_width || orig_img.rows != model_height) {
        printf("resize %d %d to %d %d\n", orig_img.cols, orig_img.rows, model_width, model_height);
        cv::resize(orig_img_rgb, cv_img, cv::Size(model_width, model_height), 0, 0, cv::INTER_LINEAR);
    }

保存mp4 

   int fps = 25;
    int duration = 2;  // 总时长为 2 秒
    cv::VideoWriter writer_top;
    cv::Mat img(480, 640, CV_8UC3); // 创建一个 640x480 的彩色帧
    const char * aaa="/storage/emulated/0/Android/data/com.rockchip.gpadc.yolodemo/files/output2.mp4";
    bool opened = writer_top.open(aaa, cv::VideoWriter::fourcc('H', '2', '6', '4'), fps, cv::Size(640, 480));
    // 创建一个 VideoWriter 对象,用来写视频

    if (!opened) {
        std::cerr << "Could not open the output video file for write\n";
        return -1;
    }

    // 定义每种颜色显示的帧数
    int frames_per_color = fps * duration / 3;  // 总帧数除以颜色数(RGB三色)

    // 循环创建每一帧
    for (int i = 0; i < frames_per_color * 3; ++i) {
        cv::Mat frame(480, 640, CV_8UC3); // 创建一个 640x480 的彩色帧

        // 根据帧号选择颜色
        if (i < frames_per_color) {
            frame.setTo(cv::Scalar(0, 0, 255)); // 红色
        } else if (i < 2 * frames_per_color) {
            frame.setTo(cv::Scalar(0, 255, 0)); // 绿色
        } else {
            frame.setTo(cv::Scalar(255, 0, 0)); // 蓝色
        }

        writer_top.write(frame); // 写帧到视频
    }

    // 释放资源
    writer_top.release();

在安卓手机上运行成功

在rkn3588上测试失败

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE4网络图片加载库(带内存缓存和磁盘缓存)

UE4网络图片加载库,带内存缓存和磁盘缓存,支持自定义缓存大小,支持蓝图和C++代码调用 1、调用示例 2、对外暴露函数 3、源代码-网络模块 KeImageNet.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreM…

链表操作III

看这篇文章之前&#xff0c;可以先看看链表操作I和链表操作II。而这篇文章主要是想说明两道关于链表环的问题。 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则…

【六十】【算法分析与设计】用一道题目解决dfs深度优先遍历,dfs中节点信息,dfs递归函数模板进入前维护出去前回溯,唯一解的剪枝飞升返回值true

路径之谜 题目描述 小明冒充X星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是nn个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着音走,也不能跳跃。每走到一个新方格,就要向正北 方和正西…

【Linux】解决ubuntu20.04版本插入无线网卡没有wifi显示【无线网卡Realtek 8811cu】

ubuntu为Realtek 8811cu安装驱动&#xff0c;解决wifi连接问题 1、确认无线网卡的型号-Realtek 8810cu2、下载并配置驱动 一句话总结&#xff1a;先确定网卡的型号&#xff0c;然后根据网卡的型号区寻找对应的驱动下载&#xff0c;下载完成之后在ubuntu系统中进行编译&#xff…

3D 文件格式的江湖纷争

自从上世纪 60 年代计算机辅助设计(Computer Aided Design, CAD)发明已来,3D 图形产业繁荣发展,逐步覆盖工业制造、影视游戏、VR/AR 、3D 打印等各个领域。如果说 3D 模型是构成 XR 应用场景的基础组件,那么 3D 文件格式就是构建 XR 世界沟通语言。而伴随各种 3D 建模软件…

C++链表操作入门

数据结构基础&#xff1a;链表操作入门 数据结构基础&#xff1a;链表操作入门链表的基本概念链表的基本操作输出链表插入节点删除节点查找值 完整的链表操作示例结语 数据结构基础&#xff1a;链表操作入门 在计算机科学中&#xff0c;数据结构是组织和存储数据的方式&#x…

H264 编码标准常见术语解释

H264 编码标准 H.264编码标准&#xff0c;也被称作MPEG-4 AVC&#xff08;Advanced Video Coding&#xff09;&#xff0c;是一种被广泛使用的数字视频压缩标准&#xff0c;由国际电信联盟&#xff08;ITU-T&#xff09;和国际标准化组织&#xff08;ISO&#xff09;共同开发。…

【蓝牙协议栈】【BLE】低功耗蓝牙工作流程(角色\广播\扫描\连接等专业名词介绍)

1. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅&#xff0c;【精讲蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#x…

谷歌搜索seo排名怎么做上去?

谷歌算法纵使千变万化&#xff0c;用户体验&#xff08;UX&#xff09;也始终是核心&#xff0c;用户体验包含很多&#xff0c;但核心就是让访问你网站的人觉得你的网站看着顺眼&#xff0c;同时轻松找到他们需要的信息或服务&#xff0c;这意味着你的网站得易于导航&#xff0…

命名空间:namespace

对于无名命名空间 &#xff1a;但是不能再次定义相同名称的变量 在同一文件中

Stable Diffusion WebUI 使用 LoRA 调整风格——详细教程

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本教程旨在深入探讨 LoRA 模型的奥秘&#xff0c;涵盖其基本概念、独特作用以及实操指南。我们将从下载和使用LoRA的步…

Laravel 6 - 第十五章 验证器

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

微信小程序实时日志使用,setFilterMsg用法

实时日志 背景 为帮助小程序开发者快捷地排查小程序漏洞、定位问题&#xff0c;我们推出了实时日志功能。开发者可通过提供的接口打印日志&#xff0c;日志汇聚并实时上报到小程序后台。开发者可从We分析“性能质量->实时日志->小程序日志”进入小程序端日志查询页面&am…

【八股】计算机网络篇

网络模型 应用层【HTTP&#x1f449;报文/消息】 传输层【TCP或UDP&#x1f449;段&#x1f449;MSS】网络层【IP、寻址和路由&#x1f449;MTU】 ①IP&#xff08;Internet Protocol&#xff0c;网际协议&#xff09;主要作用是定义数据包的格式、对数据包进行路由和寻址&…

【Linux-14】进程地址空间&虚拟空间&页表——原理&知识点详解

前言 大家好吖&#xff0c;欢迎来到 YY 滴 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

STM32的GPIO输入和输出函数详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. GPIO模式 2. GPIO输出 2.1 RCC 2.2 GPIO 3. 代码示例 3.1 RCC时钟 3.2 GPIO初始化 3.3 GPIO输出函数 3.4 推挽输出和开漏输出 4. GPIO输入 4.1 输入模式 4.2 数据读取函数 5. C语言语法 1…

2024免费最好用的苹果电脑mac虚拟机工具Parallels Desktop19中文版下载

一、软件概述 Parallels Desktop是一款专为Mac设计的虚拟机软件&#xff0c;它允许用户在Mac上同时运行Windows、Linux等多个操作系统&#xff0c;而无需额外的硬件设备。通过Parallels Desktop&#xff0c;Mac用户可以轻松地在同一台电脑上体验不同操作系统的功能和应用程序。…

Burpsuite CA证书导入浏览器、导入本地

前言 为什么要导入证书&#xff0c;因为要获得浏览器的信任、本地的信任&#xff1b;才能抓包 导入浏览器 1.从bp导出证书 然后打开火狐浏览器 打开bp,设置好代理 火狐浏览器foxyproxy开启代理 访问https://www.baidu.com 可以抓到https的包 本地导入CA证书 可能某一天你要…

AIGC实战——基于Transformer实现音乐生成

AIGC实战——基于Transformer实现音乐生成 0. 前言1. 音乐生成的挑战2. MuseNet3. 音乐数据3.1 巴赫大提琴组曲数据集3.2 解析 MIDI 文件3.3 分词3.4 创建训练数据集 4. MuseNet 模型4.1 正弦位置编码4.2 多输入/输出 5. 音乐生成 Transformer 的分析6. 多声部音乐分词6.1 网格…

牛客NC195 二叉树的直径【simple DFS C++ / Java /Go/ PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/15f977cedc5a4ffa8f03a3433d18650d 思路 最长路径有两种情况&#xff1a; 1.最长条路径经过根节点&#xff0c;那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。 2.最长路径没有经过根节点&#xf…
最新文章