如何使用 Android 在相机预览中添加卡通脸

Posted

技术标签:

【中文标题】如何使用 Android 在相机预览中添加卡通脸【英文标题】:How to add cartoon face on Camera Preview using Android 【发布时间】:2018-02-01 22:21:34 【问题描述】:

我有一个模块可以在实时相机预览中将卡通脸放在眼睛或其他任何地方。我正在使用 Moodme SDK。我已经实现了相机预览。我得到地标 x 和 y 轴值。但我不知道在哪里添加这些地标以及如何使用地标将该图像放在眼睛上。这是在实时摄像头上获取人脸的代码。

 @Override
public void onImageAvailable(ImageReader reader) 
    Image image = imageReader.acquireLatestImage();
    if (image == null) 
        return;
    
    ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
    byte[] yBytes = new byte[yBuffer.remaining()];
    yBuffer.get(yBytes);
    ByteBuffer uBuffer = image.getPlanes()[1].getBuffer();
    byte[] uBytes = new byte[uBuffer.remaining()];
    uBuffer.get(uBytes);
    ByteBuffer vBuffer = image.getPlanes()[2].getBuffer();
    byte[] vBytes = new byte[vBuffer.remaining()];
    vBuffer.get(vBytes);

    tracker.processImageBuffer(yBytes, WIDTH, HEIGHT, WIDTH, MDMTrackerManager.FrameFormat.GRAY);
    //renderer.updateTextureImage(yBytes, uBytes, vBytes, image.getPlanes()[1].getPixelStride());
    image.close();

    if (tracker.isFaceTracked()) 
    //    renderer.updateVertices();
    

    if (tracker.isFaceTracked()) 
        // translate to opengl coordinates
        float[] landmarks = new float[66*2];


        for (int i = 0; i < 66; ++i) 
            if(i >=17 && i <27 || i >=36 && i <48 ) 
                landmarks[2 * i] = 1.0f - tracker.getLandmarks()[2 * i] / (HEIGHT / 2);
                landmarks[2 * i + 1] = 1.0f - tracker.getLandmarks()[2 * i + 1] / (WIDTH / 2);
            
        
      // renderer.updateLandmarks(landmarks);
     else 
      //  renderer.updateLandmarks(null);
    

    long currentTime = System.currentTimeMillis();
    double fps = 1000.0 / (currentTime - lastFrameTime);

    updater.update(fps);

    lastFrameTime = currentTime;

我也使用了人脸检测库,但这并没有给我准确的结果。是否有任何好的人脸检测库并将图像或蒙版放在相机预览上。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

有许多库可以在相机预览中添加面罩。几乎所有人都使用 OpenCV。查看这些库。

FaceFilter Face Replace FaceTracker android GPUimage

Android GPUimage 似乎在相机预览中添加了图像。类似的question 使用此库在相机预览中添加面罩。您可以查看问题上发布的答案。

FaceFilter 库执行相同的工作,但在捕获的图像上。但是,您可以看到作者发布的库的tutorial 并将其与人脸检测集成。人脸检测有几个教程。这个tutorial 解释了如何实现人脸检测,同时在上面叠加图形。虽然教程中关于叠加图形的内容不多,但或许能解决你的问题。

【讨论】:

先生,我用过一些图书馆。但那是图像上的图像。我想在另一个 .png 图像上进行实时相机预览。而且我只需要 android 的库而不是 ios 的库。 先生,实际上我不想只进行面部检测。我想要眼睛和耳朵的 x 和 y 轴,虽然我得到了眼睛的确切位置,但我无法找到耳朵 x 和 y 轴。所以我可以把图像放在眼睛上。上面的链接我已经试过了。 教程最后也解释了额外的人脸数据。充分利用它。

以上是关于如何使用 Android 在相机预览中添加卡通脸的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中制作圆形的相机预览?

如何在 Android 中使用一台相机创建多镜头或预览

Android:如何通过回调显示相机预览?

如何使用 Android API 将相机预览大小设置为全屏?

如何在android中设置相机预览的大小

如何在Android中修复相机预览(surfaceview)的正确纵横比?