gpt4 book ai didi

java - 减慢相机对象的 setPreviewCallback 方法

转载 作者:行者123 更新时间:2023-11-29 22:26:09 25 4
gpt4 key购买 nike

我在相机对象 (mCamera) 上运行以下代码,以检测相机指向的任何面孔。问题是虽然这个过程非常快,但它确实会减慢应用程序的其余部分的速度,即当我在面部检测运行时按下按钮做某事时,它需要大约半秒钟的时间来注册它。我的想法是,我以某种方式放慢或减少它在特定时间内进行的回叫次数,然后按下此按钮会快得多:

Thread thread = new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
mCamera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(final byte[] _data, Camera _camera) {
Camera.Parameters parameters = mCamera.getParameters();
int format = parameters.getPreviewFormat();
// YUV formats require more conversion
if (format == ImageFormat.NV21) {
int w = parameters.getPreviewSize().width;
int h = parameters.getPreviewSize().height;
// Get the YuV image
YuvImage yuv_image = new YuvImage(_data, format, w, h, null);
// Convert YuV to Jpeg
Rect rect = new Rect(5 * w / 10, 1 * h / 5, 8 * w / 10, 4 * h / 5);
final ByteArrayOutputStream output_stream = new ByteArrayOutputStream();
yuv_image.compressToJpeg(rect, 10, output_stream);
// Convert from Jpeg to Bitmap
Bitmap bmp = Bitmap.createScaledBitmap(BitmapFactory.decodeByteArray(output_stream.toByteArray(), 0, output_stream.size()), 3 * w / 10, 3 * h / 5, true);
detectFaces(bmp, w, h);
}
}
});
}
});
thread.start();

它已经在一个 Thread 中,因为我认为这可能会有所帮助,但实际上并没有。有没有办法改变回拨频率?

最佳答案

我已经完成了一些实时人脸检测的工作,以下是我在此过程中学到的一些东西:

  • 影响 API 人脸检测器速度的最大因素是所检查图像的大小。您可能会考虑使用最小的合理 Camera.getSupportedPreviewSizes() 来帮助加快速度。请注意,预览大小和图片大小是独立的参数,因此您不必牺牲捕获的图片质量,除非您要将预览帧保存为捕获。
  • 此外,如果有任何方法可以假设人脸应该在帧的某个边界区域内,您可以通过将预览帧裁剪到这些边界并将该位图传递给人脸检测器来获得一些性能。
  • 避免在处理预览帧的循环中分配任何新对象。需要进行的分配和最终的垃圾收集可能会花费大量时间。使用单例、静态或成员变量来保留可以重复使用的东西,而不是分配新的东西。
  • 最后,一旦您使其性能达到最佳,请考虑限制线程不要尝试处理每一帧,而是可能每两秒处理一帧。添加一个名为 mLastFrameAnalzedTime 的成员 var 到您的线程类。将上次成功解码/检测的时间存储在其中,然后每次获得新帧时,检查是否已经过了足够的时间来处理下一帧。

希望其中一些有所帮助。

关于java - 减慢相机对象的 setPreviewCallback 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5909164/

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