opencv android 使用笔记

目录

获取app路径:

下载:OpenCV-android-sdk

cmakelist配置:

头文件路径:

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

读取图片例子

保存mp4


获取app路径:

java 复制代码
    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配置:

bash 复制代码
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去掉即可。

读取图片例子

cpp 复制代码
#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

cpp 复制代码
   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上测试失败

相关推荐
Moliay2 分钟前
【资料分析】刷题日记2
笔记·公考·行测·常识·资料分析
小齿轮lsl41 分钟前
PFC理论基础与Matlab仿真模型学习笔记(1)--PFC电路概述
笔记·学习·matlab
天玑y2 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
web_learning_3213 小时前
source insight学习笔记
笔记·学习
无妄啊______3 小时前
mysql笔记9(子查询)
数据库·笔记·mysql
z2014z4 小时前
系统架构设计师教程 第5章 5.3 系统分析与设计 笔记
笔记·系统架构
Jouzzy5 小时前
【Android安全】Ubuntu 16.04安装GDB和GEF
android·ubuntu·gdb
青石横刀策马5 小时前
泛读笔记:从Word2Vec到BERT
笔记·bert·word2vec
极客先躯5 小时前
java和kotlin 可以同时运行吗
android·java·开发语言·kotlin·同时运行
Magnetic_h6 小时前
【iOS】单例模式
笔记·学习·ui·ios·单例模式·objective-c