目录
[c++ jni 保存图片 到程序目录:](#c++ jni 保存图片 到程序目录:)
[pull 单个文件:](#pull 单个文件:)
测试保存Ok:
CMakeLists.txt
bash
project(mediapipehand)
cmake_minimum_required(VERSION 3.10)
# 设置OpenCV路径 - 指向D盘根目录下的opencv目录
set(OpenCV_DIR B:/soft/android/opencv-4.12.0-android-sdk/OpenCV-android-sdk/sdk/native/jni)
find_package(OpenCV REQUIRED core imgproc imgcodecs)
# 设置ncnn路径 - 指向D盘根目录下的ncnn目录
set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20221128-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
find_package(ncnn REQUIRED)
add_library(mediapipehand SHARED mediapipehand.cpp hand.cpp landmark.cpp ndkcamera.cpp cls_mobilenet.cpp)
target_link_libraries(mediapipehand ncnn ${OpenCV_LIBS} camera2ndk mediandk)
获取保存目录:
java
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
var aaa=1
} else {
// Android 9 及以下
var aaa=2
}
val dir = getExternalFilesDir(Environment.DIRECTORY_PICTURES) // app 专属目录
val file = File(dir, "hand_crop.jpg")
val path = file.getAbsolutePath()
c++ jni 保存图片 到程序目录:
文件管理器可以看到
cpp
#include <string>
#include <chrono>
#include <iomanip>
#include <sstream>
// 裁剪手部区域
cv::Mat hand_crop = rgb(bbox).clone();
cv::Mat img_rgb;
// 转换BGR到RGB
cv::cvtColor(hand_crop, img_rgb, cv::COLOR_BGR2RGB);
auto now = std::chrono::system_clock::now();
auto now_time = std::chrono::system_clock::to_time_t(now);
std::stringstream time_ss;
time_ss << std::put_time(std::localtime(&now_time), "m%d_%H%M");
std::string temp_path = "/storage/emulated/0/Android/data/com.example.classroom/files/Pictures/hand_" +
time_ss.str() + "_" + std::to_string(img_num) + ".jpg";
img_num++;
if (cv::imwrite(temp_path, img_rgb)) {
__android_log_print(ANDROID_LOG_INFO, "FileSave", "Saved to: %s", temp_path.c_str());
}
pull 单个文件:
bash
adb pull /storage/emulated/0/Android/data/com.example.classroom/files/Pictures/hand_crop.jpg .
pull目录:
bash
adb pull /storage/emulated/0/Android/data/com.example.classroom/files/Pictures/ .