gpt4 book ai didi

android - 将OpenCV中的Mat从MLkit中传递给Facedetector

转载 作者:行者123 更新时间:2023-12-02 17:28:14 26 4
gpt4 key购买 nike

对于使用NVIDIA防护罩的个人应用程序,我使用的是Firebase的MLKit,具有人脸检测功能,但是从OpenCV传递Mat并不是真正想要的。

在我的Android应用程序中,我使用由OpenCV制作的自定义相机 View ,该 View 在处理的每个帧上创建一个Mat垫。在此过程中,我正在检查每个帧的脸孔。

我尝试的第一件事是使用以下代码将Mat转换为Bitmap:

public static Bitmap bitmapFromMat(Mat mRgba) {
Bitmap bitmap = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mRgba, bitmap);

return bitmap;
}

之后,我将位图传递给了firebase,它与以下代码一起工作:

FirebaseVisionImage fbImage = FirebaseVisionImage.fromBitmap(bitmap);
fbDetector.detectInImage(fbImage) ....

在运行应用程序的前1分钟内,此方法运行良好。之后,应用程序开始严重滞后并停止工作,没有任何错误消息。在运行日志中,我看到一条消息,未将位图与相机一起使用。

之后,我正在寻找一种将Mat转换为bytearray和bytebuffer的解决方案,但是我尝试过的所有解决方案都失败了。
创建元数据的代码:

metadata = new FirebaseVisionImageMetadata.Builder()
.setWidth(mFrame.width())
.setHeight(mFrame.height())
.setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
.setRotation(FirebaseVisionImageMetadata.ROTATION_0)
.build();

(确保我将轮换更改为每种可能性并进行了测试)

我用来从Mat转换为bytearray的代码:

byte[] bytes = new byte[(int) (mFrame.total() * mFrame.channels())];
mFrame.get(0,0, bytes);

FirebaseVisionImage fbImage = FirebaseVisionImage.fromByteArray(bytes, metadata);

(这是因为面部检测返回了0张面部)

我用来将位图转换为字节缓冲区的代码:

        int size = bitmap.getRowBytes() * bitmap.getHeight();
ByteBuffer byteBuffer = ByteBuffer.allocate(size);
bitmap.copyPixelsToBuffer(byteBuffer);

FirebaseVisionImage fbImage = FirebaseVisionImage.fromByteBuffer(byteBuffer, metadata);

(这是因为面部检测返回0张面部)

我期望的是每帧都检测到一张脸,但不幸的是事实并非如此。当前的结果是崩溃或检测到0张面孔之后的巨大滞后。

我希望有人能够帮助我解决这个问题!

提前非常感谢!

最佳答案

在JavaCameraView类中,您需要具有这样的Mat函数

 @Override
public Mat rgba() {
// Imgproc.cvtColor(mYuvFrameData, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4);

if (previewFormat == ImageFormat.NV21) {
Imgproc.cvtColor(mYuvFrameData, mRgba, Imgproc.COLOR_YUV2RGB_NV21, 4);
}
else if (previewFormat == ImageFormat.YV12) {
Imgproc.cvtColor(mYuvFrameData, mRgba, Imgproc.COLOR_YUV2RGB_I420, 4); // COLOR_YUV2RGBA_YV12 produces inverted colors
}
return mRgba;
}

您会注意到,函数initializeCamera具有ImageFormat YV12和NV21 ...这是MLkit所需的图像格式。

然后,在面部检测器上,您需要像这样从RGBA2YUV转换Mat:
    Imgproc.cvtColor(mRgba,mRgba,Imgproc.COLOR_RGBA2YUV_YV12);

byte[] return_buff = new byte[(int) (mRgba.total() *
mRgba.channels())];
mRgba.get(0, 0, return_buff);

您的FirebaseVision构建器需要像这样
FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
.setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_YV12)
.setWidth(1920) // 480x360 is typically sufficient for
.setHeight(1080) // image recognition
.setRotation(0)
.build();


image = FirebaseVisionImage.fromByteArray(return_buff,metadata);

关于android - 将OpenCV中的Mat从MLkit中传递给Facedetector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57657460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com