Android デバイスのカメラからのフレームを使用して画像処理を行うスレッドを実行し続ける必要があります。
私は最も簡単な方法を試しました
new Thread() {
@Override
public void run() {
while (true) {
/* Processing frames here */
}
}
}.start();
しかし、これは CPU を大量に消費し、UI が遅れ始めます。また、UI スレッドが CPU 時間を取得できるようにフレームを処理した後に追加さThread.sleep(300)
れますが、ある程度は役に立ちますが、正しい方法とは思えません。
これを処理するための良いアプローチについていくつかのアイデアを持ちたいと思います。
編集:使用AsyncTask
private DetectionTask detectionTask;
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
/* Doing some stuff here */
camera.addCallbackBuffer(data);
if (detectionTask != null && detectionTask.getStatus() != AsyncTask.Status.FINISHED)
return;
detectionTask = new DetectionTask();
detectionTask.execute();
}
private class DetectionTask extends AsyncTask<Void, Void, float[]> {
@Override
protected float[] doInBackground(Void... params) {
/* Processing frames here */
return result;
}
@Override
protected void onPostExecute(float[] result) {
if (result != null) {
/* Update UI */
}
};
};