我在相机对象(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();
它已经在线程中,因为我认为这可能会有所帮助,但事实并非如此。无论如何都要改变回叫频率?
答案 0 :(得分:2)
我已经完成了一些实时进行人脸检测的工作,这里有一些我在学习过程中学到的东西:
希望其中一些有用。
答案 1 :(得分:0)
您可以尝试在Thread.sleep()
方法中插入一些onPreviewFrame
调用,以便代码的其他部分也获得一些cpu时间。上面的代码看起来可能会占用onPreview代码中几乎所有的cpu时间。
您可能需要玩睡眠时间,因为太多睡眠会使预览速度降低。
答案 2 :(得分:0)
答案 3 :(得分:0)
请查看以下Camera.Parameters方法的文档
getSupportedPreviewFpsRange getPreviewFpsRange setPreviewFpsRange
在我的Nexus上,我有3种可能的预览FPS 最小15fps,最大15fps 最小15fps,最大30fps 最小24fps,最大30fps
注意: getSupportedPreviewFpsRange的返回值缩放1000 - 我不明白为什么。
我不确定这是否有效,因为我测量了两次调用onPreviewFrame之间的时间,而且我得到了fps 1000 ....也许我的测量中存在错误。