Вопрос или проблема
Можно ли использовать определение landmark’ов рук mediapipe непосредственно на стороне NDK?
Решение для landmark’ов рук написано на Kotlin, но мой проект будет использовать GameActivity, и у меня уже есть буфер на стороне C++, взятый из API camera2ndk (формат yuvN12, но его легко конвертировать в RGB(A), если это необходимо). Я вижу, что tasks-vision-0.10.14.aar содержит общую библиотеку libmediapipe_tasks_vision_jni.so (и я мог бы взять hand_landmarker.task из папки assets примера на https://github.com/google-ai-edge/mediapipe-samples), но я в замешательстве, какие заголовочные файлы я должен использовать для этой общей библиотеки и как закодировать остальное. Какой пример на C/C++ из mediapipe будет лучшим для начала?
Ответ или решение
Для использования Mediapipe для отслеживания рук на стороне NDK в вашем проекте, у вас есть возможность интеграции библиотеки Mediapipe с использованием C++. Ниже описаны шаги, которые помогут вам реализовать эту задачу.
1. Подготовка окружения
Убедитесь, что у вас установлены все необходимые инструменты для разработки с использованием NDK. Это включает Android Studio и NDK.
2. Установка Mediapipe
Сначала вам нужно получить Mediapipe. Вы можете скачать эту библиотеку из репозитория GitHub:
git clone https://github.com/google/mediapipe.git
cd mediapipe
3. Создание вашего проекта
Создайте новый проект NDK в Android Studio и добавьте необходимые зависимости в файл build.gradle
. Включите поддержку C++:
android {
...
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
...
}
4. Добавление библиотеки Mediapipe
Скопируйте необходимые заголовочные файлы и библиотеку libmediapipe_tasks_vision_jni.so
в ваш проект. Обратите внимание на структуру каталогов и убедитесь, что вы правильно используете пути.
5. Написание C++ кода
Вам нужно создать C++ файл (например, hand_tracking.cpp
), который будет обрабатывать изображение, переданное из вашего буфера. Вам нужно использовать JNI для вызова методов из Java.
Пример кода:
#include <jni.h>
#include <mediapipe/framework/calculator_framework.h>
#include <mediapipe/gpu/gpu_shared.h>
#include <mediapipe/tasks/vision/hand_landmarker/hand_landmarker.h>
using namespace mediapipe;
extern "C" JNIEXPORT void JNICALL
Java_com_example_yourapp_YourActivity_processHandTracking(JNIEnv *env, jobject thiz, jbyteArray image) {
jbyte* bytes = env->GetByteArrayElements(image, 0);
// Преобразуйте байты изображения в формат, используемый Mediapipe (например, BGR или RGBA).
// Создайте HandLandmarker и настройте необходимые параметры
auto landmarker = hand_landmarker::HandLandmarker::CreateFromFile("path/to/hand_landmarker.task");
std::vector<Landmarks> landmarks;
landmarker->Detect(image_data, &landmarks);
// Обработка результатов
env->ReleaseByteArrayElements(image, bytes, 0);
}
6. Создание конфигурации CMake
Добавьте необходимые библиотеки и зависимости в ваш CMakeLists.txt
:
cmake_minimum_required(VERSION 3.4.1)
add_library(native-lib SHARED
hand_tracking.cpp)
find_library(log-lib log)
target_link_libraries(native-lib
${log-lib}
mediapipe_tasks_vision_jni)
7. Вызов из Java/Kotlin
Теперь вы можете использовать вызовы из вашего Java/Kotlin кода.
Пример вызова метода из Java:
public class YourActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
public native void processHandTracking(byte[] image);
// Ваш метод для получения изображения и вызова нативного метода:
private void onImageAvailable(Image image) {
// Получите байты изображения
byte[] imageData = ... ;
// Вызовите нативный метод
processHandTracking(imageData);
}
}
Заключение
Следуя этим шагам, вы сможете интегрировать Mediapipe для отслеживания рук в вашем проекте на Android с использованием NDK. Убедитесь, что вы правильно обрабатываете форматы изображений и настройте параметры для наиболее эффективной работы модели. Удачи!