PaddlePaddle / Paddle-Lite

PaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎)
https://www.paddlepaddle.org.cn/lite
Apache License 2.0
6.93k stars 1.61k forks source link

接口问题 #9067

Closed jeekMic closed 7 months ago

jeekMic commented 2 years ago
public boolean process(int inTextureId, int outTextureId, int textureWidth, int textureHeight, String savedImagePath) {
    if (ctx == 0) {
        return false;
    }
    return nativeProcess(ctx, inTextureId, outTextureId, textureWidth, textureHeight, savedImagePath);
}

我看Android demo里面接口是这个样子,对纹理进行处理,有其他接口吗,我项目相机不是这中国打开方式,还有uvc相机,,没有这种纹理接口回调,不知道咋办

hong19860320 commented 2 years ago

这个不是通过纹理打开相机,而是在android java 层打开相机,将相机的 preview 渲染在 surfaceview 上,而 surfaceview 的渲染是基于 OpenGL 的,也就是相机的 preview 会被先绘制在 OpenGL texture 上,然后调用 native c++ 将 texture 转为 OpenCV image 基于 Paddle Lite 进行目标检测,然后将检测框绘制在新的 texture 中,最后返回给 android java 层后,将新的texture 绘制在 surfaceview,因此,基于这个 demo 可以用来做很多有意思的应用,例如 AR 变脸、美妆。

当然,如果觉得该 demo 的 android app 层的逻辑比较复杂,对 OpenGL 不熟悉的话,可以基于这个demo 改 https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/develop/image_classification/android/app/java/image_classification ,这个demo是基于paddlelite java接口的。

hong19860320 commented 2 years ago
public boolean process(int inTextureId, int outTextureId, int textureWidth, int textureHeight, String savedImagePath) {
    if (ctx == 0) {
        return false;
    }
    return nativeProcess(ctx, inTextureId, outTextureId, textureWidth, textureHeight, savedImagePath);
}

我看Android demo里面接口是这个样子,对纹理进行处理,有其他接口吗,我项目相机不是这中国打开方式,还有uvc相机,,没有这种纹理接口回调,不知道咋办

如果你的设备是armlinux,我们也提供了相关demo https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/master/PaddleLite-armlinux-demo/object_detection_demo

jeekMic commented 2 years ago

是安卓的,我设备是RX3399的开发板,Android的系统,设备上接了三个相机,都是通过uvc的方式打开,无法通过纹理去绘制,想着看有没有好办法直接处理相机帧数据,像普通的相机这样处理相机帧: CameraPreviewManager.getInstance().startPreview(mContext, mAutoCameraPreviewView, PREFER_WIDTH, PERFER_HEIGH, new CameraDataCallback() { @Override public void onGetCameraData(byte[] data, Camera camera, int width, int height) {

                }
            });
hong19860320 commented 2 years ago

是安卓的,我设备是RX3399的开发板,Android的系统,设备上接了三个相机,都是通过uvc的方式打开,无法通过纹理去绘制,想着看有没有好办法直接处理相机帧数据,像普通的相机这样处理相机帧: CameraPreviewManager.getInstance().startPreview(mContext, mAutoCameraPreviewView, PREFER_WIDTH, PERFER_HEIGH, new CameraDataCallback() { @OverRide public void onGetCameraData(byte[] data, Camera camera, int width, int height) {

                }
            });

由于不是走 Android Camera HAL,所以不能像内置相机一样通过 android camera api 进行预览,得对 demo 进行改造,需要将jni 层的texture相关全部替换成bitmap或者yuv raw数据,将UVC相机拍摄的 yuv raw 数据或转换后的 bitmap 数据传入到jni层的,在jni层将其转为 opencv 的 image 进行推理,只需要改下 texture2cvimage 相关代码即可,推理相关逻辑可以不用动。

最快的是直接使用 paddlelite java api 进行推理 https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/master/PaddleLite-armlinux-demo/object_detection_demo ,不过 demo 是拍照处理单张图片的,不是处理 camera preview。