这是我的理解(请纠正我,如果我走了商标)我的使用线程正确将允许应用程序看起来多任务,尽管高处理器负载。使用线程的滞后应用程序的问题
在我的应用我有我处理来自相机预览拍摄的图像,并试图做到实时人脸检测与成功的很大一个线程。问题在于,同时我希望在屏幕上能够按下按钮,并且采取了一些与摄像机检测方法相关的操作。
的问题是人脸检测是相当快,但是当我去按按钮它需要一个良好的第二个左右对此作出回应。如果没有激活面部检测线程(即不会调用start()方法),该按钮非常快速。下面是我的代码剥离版本,因为它太长只是直职位,因为它是:
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
faceThread = new Thread(new Runnable(){
public void run(){
//Get camera preview image and detect faces
}
});
faceThread.start();
}
public void onClickShoot(View v) throws InterruptedException,
media = new MediaPlayer();
media.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
media.stop();
media.reset();
}
});
media.setDataSource(this, dataPath);
media.prepare();
media.start();
//And some other stuff here too.
}
难道只是我对实际上这个延迟它是一个移动平台,我的期望太高的限制许多?或者有什么方法可以完成这项工作?如果你需要更多关于我在做什么的信息,请点击:)。
编辑(更多的代码来解决问题):
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(0, 0, w/3, h); // Rect of the image in which to search for the face
final ByteArrayOutputStream output_stream = new ByteArrayOutputStream();
yuv_image.compressToJpeg(rect, 10, output_stream);
// Convert from Jpeg to Bitmap
detectFaces(BitmapFactory.decodeByteArray(
output_stream.toByteArray(), 0,
output_stream.size()));
Log.v("TEST", "TEST");
}
}
});
public void detectFaces(Bitmap bmp) {
FaceView faceView = new FaceView(this, bmp);
}
我敢肯定的论点是CPU时间的人脸检测与媒体播放器不sahre比一个非常小的图像之外的任何资源。媒体是一个非常小的.wav文件,它存储在资源的原始文件夹中,因此没有重量级的流媒体。在声音播放后需要立即再次启动人脸检测,我尝试在线程上使用等待(100)调用,但没有改变延迟的事实。他们的收获是否阻止了等待的线索? – SamRowley 2011-01-31 15:44:46