opencv android 使用笔记

news2024/12/25 14:43:53

目录

获取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.coloradmin.cn/o/1619941.html

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

相关文章

这个禁止打字,只能发语音的AI Native产品,成了硅谷最火的社交软件

最近&#xff0c;一款AI驱动的社交应用AirChat在硅谷引发了热切关注&#xff0c;这款产品背后的AI技术可以实时将语音转录为文字&#xff0c;并支持多语言翻译。综合来看&#xff0c;AirChat的火可以持续多久呢&#xff1f; 过去一周&#xff0c;硅谷线上到处充斥着求链接的声音…

团队如何异地共享文件?

在当今全球化的办公环境中&#xff0c;团队成员往往分散在不同的地理位置上。为了更好地协同工作&#xff0c;团队之间需要快速、安全地共享文件。本文将介绍一种名为“团队异地共享文件”的解决方案&#xff0c;它能够帮助团队成员在不同地点方便地共享文件&#xff0c;提高工…

抽象工厂模式设计实验

【实验内容】 楚锋软件公司欲开发一套界面皮肤库&#xff0c;可以对 Java 桌面软件进行界面美化。为了保护版权&#xff0c;该皮肤库源代码不打算公开&#xff0c;而只向用户提供已打包为 jar 文件的 class 字节码文件。用户在使用时可以通过菜单来选择皮肤&#xff0c;不同的…

【计算机网络】MAC地址简介

MAC&#xff08;Medium Access Control&#xff09;&#xff0c;即媒介访问控制&#xff0c;是计算机网络通信中的重要概念。每个NIC&#xff08;Network Interface Card&#xff09;&#xff0c;即网络适配器&#xff0c;都具有独自且不变的MAC地址&#xff08;烧录的&#xf…

AI写作助手:一键智能改写文章质量高

无论是自媒体人写作文章、还是企业撰写宣传资料&#xff0c;文字都是表达思想和传递信息的重要介质。然而&#xff0c;有时候我们在工作中可能会遇到写作困难&#xff0c;或者想要对文章进行一定程度的改写以增加独特性和质量。而在这样的背景下&#xff0c;智能改写文章成为了…

jasypt组件死锁bug案例分享

事故描述 1、上午9.55发布了一个Apollo动态配置参数&#xff1b; 2、片刻后&#xff0c;服务器接口开始出现大量的超时告警&#xff0c;似乎是某资源被耗尽不足分配&#xff1b; 3、正值业务请求高峰的上午十点&#xff08;平台上午10点会有一些活动会拉一波用户流量&#x…

【项目实战】基于高并发服务器的搜索引擎

【项目实战】基于高并发服务器的搜索引擎 目录 【项目实战】基于高并发服务器的搜索引擎搜索引擎部分代码index.htmlindex.hpplog.hppparser.cc&#xff08;用于对网页的html文件切分且存储索引关系&#xff09;searcher.hpputil.hpphttp_server.cc&#xff08;用于启动服务器和…

【C++】项目级的组织结构与Cmake编译

文章目录 C项目级的组织结构与Cmake编译分文件编写程序C项目级的组织结构Cmake编译 C项目级的组织结构与Cmake编译 分文件编写程序 (1) 创建后缀名为.h的头文件max.h&#xff0c;并在其中写函数的声明 #include<iostream> using namespace std; int max(int a, int b)…

深圳比创达电子EMC|EMC电磁兼容性:保障电子设备和谐共存的关键

在电子技术日新月异的今天&#xff0c;各种电子设备如雨后春笋般涌现&#xff0c;它们为我们的生活带来了极大的便利。然而&#xff0c;随着电子设备种类的增多&#xff0c;电磁干扰问题也日益凸显。 为了确保这些设备能够在复杂的电磁环境中正常工作&#xff0c;EMC电磁兼容性…

OPTEE的FTRACE跟踪技术实战

【按语】:对于排除性能问题或优化代码来说,有没有更好的工具可以使用?FTRACE记录了对函数的所有调用,并包含计时信息。因此,对于排除性能问题或优化代码来说,它是一个很有价值的工具。本博客描述如何使用FTRACE为TA生成函数调用图。相关知识点介绍,请参考OPTEE Ftrace函…

艾瑞泽5汽车电子控制单元CAN通信数据读写车辆网络系统交互接口

艾瑞泽5的网关接口数据交换通常涉及车辆内部电子设备之间的信息传输&#xff0c;包括车身系统、娱乐系统、远程控制、车辆状态监控、CAN数据采集分析、整车DBC控制策略等信息。 艾瑞泽5作为一款采用CAN协议的汽车&#xff0c;其CAN通信的开发可以提高车辆的安全性、可靠性和实…

c++设计模式之桥接模式(拼接组合)

桥接模式&#xff1a;就是进行拼接组装 应用举例&#xff1a; 1.定义了形状&#xff0c;抽象形状接口&#xff0c;圆&#xff0c;矩形 2.定义了颜色&#xff0c;抽象颜色接口&#xff0c;红色&#xff0c;蓝色 3&#xff0c;怎么桥接&#xff0c;抽象具体形状和具体颜色的组合…

数据类型总结

1 引言 在计算机的世界里&#xff0c;数据类型是被人类定义出来的&#xff0c;方便人去更好地理解、辨别数据。计算机只能识别二进制数&#xff0c;不可能要求写代码时&#xff0c;只是输入一些0/1的东西。通过定义数据类型&#xff0c;可以让人和计算机更好地“沟通”&#x…

ESP32环境下基于SD卡与FTP实现温湿度数据采集与存储

本篇文章将介绍如何利用ESP32开发板结合SD卡与FTP服务器功能&#xff0c;实现温湿度数据的实时采集、存储与远程访问。项目代码基于Arduino IDE平台编写&#xff0c;主要依赖于以下库&#xff1a; SPIDHTWiFitime.hESP-FTP-Server-LibSDSPIFFSFS 1. 硬件连接与配置 1.1 所需…

【机器学习与实现】机器学习概述

目录 一、机器学习的基本概念和方法&#xff08;一&#xff09;基本概念&#xff08;二&#xff09;机器学习的一般过程举例&#xff08;三&#xff09;样本和参数估计 二、机器学习的步骤总结&#xff08;一&#xff09;机器学习的主要步骤&#xff08;二&#xff09;样本及样…

zookeeper安装原生开发 C API接口时报错

报出的错误&#xff1a;error: %d directive writing between 1 and 5 bytes into a region of size be 问题原因 %d 格式说明符用于格式化有符号十进制整数。它需要一个与要格式化的整数大小相匹配的缓冲区。如果缓冲区太小&#xff0c;则会导致缓冲区溢出&#xff0c;从而可…

异地组网、内部网络需求同时满足,贝锐企业路由器G300开箱体验

由于公司最近新增了办事处&#xff0c;作为IT管理员的我不仅需要搞定办事处的网络&#xff0c;还需要解决远程访问公司内部办公系统以及文件存储服务器的问题。 在此之前&#xff0c;只有少量人员出差时&#xff0c;我们采用了虚拟专网方案来进行远程访问。然而&#xff0c;新…

ROS2中node之最简单的HelloWorld(C++)案例

ROS2中node之最简单的HelloWorld&#xff08;C&#xff09;案例 1、创建工作空间2、编译工作空间3、创建功能包4、编写helloworld 代码5、编辑CMakeLists.txt6、编译工作空间所有功能包7、运行结果 1、创建工作空间 $ mkdir -p ~/devnode_ws/src $ cd ~/devnode_ws/2、编译工作…

探索SmartEDA:电路仿真的教学新境界

在电子工程的教学领域&#xff0c;随着技术的飞速发展&#xff0c;传统的教学方法已经难以满足现代学生的学习需求。近年来&#xff0c;电路仿真软件在教学中的应用逐渐受到关注&#xff0c;而SmartEDA作为一款功能强大的电路仿真软件&#xff0c;为电子工程教学带来了革命性的…

韩国机器人公司Rainbow Robotics推出RB-Y1轮式双臂机器人

文 | BFT机器人 近日&#xff0c;韩国机器人领域的佼佼者Rainbow Robotics揭开了RB-Y1移动机器人的神秘面纱&#xff0c;这款机器人以其创新的设计和卓越的功能引起了业界的广泛关注。与此同时&#xff0c;Rainbow Robotics还携手舍弗勒集团&#xff08;提供汽车、工业技术服务…