将帧(安卓中的垫子数据)从安卓传递到本机 c++ 并检测人脸

Pass frame(mat data in android ) from android to native c++ and detect face

本文关键字:本机 c++ 检测 将帧 数据      更新时间:2023-10-16

我给相机帧并在 Android 项目中初始化 OpenCV,但我不知道如何将帧传递给C++方法并从那里执行人脸检测......

我该怎么做?

我使用CameraBridgeViewBase.CvCameraViewListener2然后得到这样的框架:

public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
Core.transpose(mRgba, mRgbaT);
Imgproc.resize(mRgbaT, mRgbaF, mRgbaF.size(), 0,0, 0);
Core.flip(mRgbaF, mRgba, 1 );
return mRgba; 
}

我只是不知道如何将相机帧从 android 发送到 c++,然后将该相机帧从 c++ 发回 android。

您必须在具有本机开发工具包(NDK(支持的Android上设置OpenCV。此 Android NDK 使您能够在 C++ 中实现 OpenCV 图像处理管道,并通过 JNI(Java Native Interface(从 Android Kotlin/Java 代码调用该C++代码。

您首先必须在MainActivity中定义一个 javanative函数.java :

public native void processFrame(long matAddrGray);

然后,您将在本机 lib.cpp文件中定义一个等效C++:

void JNICALL Java_com_example_nativeopencvandroidtemplate_MainActivity_processFrame(JNIEnv *env, jobject instance, jlong matAddrGray)

java调用processFrame本机函数实际上会调用 C++ 等效函数:

public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
Mat matGray = inputFrame.gray();
processFrame(matGray.getNativeObjAddr());
return matGray;
}

然后,您可以在C++中检索 Mat 对象并对其进行处理:

void JNICALL Java_com_example_nativeopencvandroidtemplate_MainActivity_processFrame(JNIEnv *env, jobject instance, jlong matAddrGray) {
Mat &mGr = *(Mat *) matAddrGray;
// process Mat
...
}

以下是Github上的教程,其中包含一个示例OpenCV本机应用程序,以及如何在支持NDK的Android Studio中设置适用于Android的OpenCV 4.1.1的说明。

免责声明:我写了那个教程