gpt4 book ai didi

Android:快速旋转CameraPreview

转载 作者:太空宇宙 更新时间:2023-11-03 23:16:15 27 4
gpt4 key购买 nike

我正在使用 OpenCv 构建人脸检测应用程序。我正在处理在回调 onPreviewFrame 上收到的预览帧数据。我在纵向模式下使用相机,而 onPreviewFrame 在横向模式下返回数据。我正在使用此代码旋转帧数据。

public static byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight) {
byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];
// Rotate the Y luma
int i = 0;
for (int x = 0; x < imageWidth; x++) {
for (int y = imageHeight - 1; y >= 0; y--) {
yuv[i] = data[y * imageWidth + x];
i++;
}
}
// Rotate the U and V color components
i = imageWidth * imageHeight * 3 / 2 - 1;
for (int x = imageWidth - 1; x > 0; x = x - 2) {
for (int y = 0; y < imageHeight / 2; y++) {
yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + x];
i--;
yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + (x - 1)];
i--;
}
}
return yuv;
}

旋转数据后,我将字节数组转换为 OpenCv Mat。转换后我传递到 openCv native 代码。

在横向模式下(没有旋转预览数据),在处理相机预览后我能够获得近 20 FPS。但是在纵向模式下,使用上述方法,FPS 会降低到 3 FPS。在测量 rotateYUV420Degree90 所花费的时间时,这种方法是罪魁祸首。

我是 OpenCv 的新手。有没有其他方法可以让我使用 Java 代码或 native 代码快速旋转预览数据。由于我的应用程序的复杂性,我无法使用 OpenCV 提供的 JavaCameraView

最佳答案

问题:不要按列顺序遍历图像。因为,您无法从引用的局部性中获益,代码将运行得很慢。

对于 opencv,您可以结合使用转置和翻转命令。

switch (angle) {
case 0:
srcImage.copyTo(dstImage);
break;
case 90:
Core.transpose(srcImage, dstImage);
Core.flip(dstImage, dstImage, 1);
break;
case 180:
Core.flip(srcImage, dstImage, -1);
break;
case 270:
Core.transpose(srcImage, dstImage);
Core.flip(dstImage, dstImage, 0);
break;
default:
Logger.error(
"ROTATE_IMAGE_CLOCKWISE: Incorrect rotation value received: {}",
angle);
return srcImage;
}

当 Image(jpeg) 具有方向元数据时,这与用于读取输入图像的代码相同。查看opencv源码here .上面的代码是在java中。

看我的回答here , 了解方向的工作原理。把opencv和我回答的图片放在一起,很简单。

关于Android:快速旋转CameraPreview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39096071/

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