這是我的理解(請糾正我,如果我走了商標)我的使用線程正確將允許應用程序看起來多任務,儘管高處理器負載。使用線程的滯後應用程序的問題
在我的應用我有我處理來自相機預覽拍攝的圖像,並試圖做到實時人臉檢測與成功的很大一個線程。問題在於,同時我希望在屏幕上能夠按下按鈕,並且採取了一些與攝像機檢測方法相關的操作。
的問題是人臉檢測是相當快,但是當我去按按鈕它需要一個良好的第二個左右對此作出迴應。如果沒有激活面部檢測線程(即不會調用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