Медипайп трекинг рук на Android, C++ NDK сторона

Вопрос или проблема

Можно ли использовать определение 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. Убедитесь, что вы правильно обрабатываете форматы изображений и настройте параметры для наиболее эффективной работы модели. Удачи!

Оцените материал
Добавить комментарий

Капча загружается...