Я использую OpenCV, чтобы попытаться обнаружить объект на Android.Проблема в том, что экран камеры выглядит нестабильным.
1) Я пытался уменьшить разрешение камеры.
mOpenCvCameraView.setMaxFrameSize(640, 480);
2) Я пытался использовать i % 60 == 0
дляне вызывать функцию JNI (surfWithFlann) в onCameraFrame каждый раз.
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
matInput = inputFrame.rgba();
Imgproc.cvtColor(matInput, matGray, Imgproc.COLOR_RGB2GRAY);
i++;
if(pressedBtn.equals("지폐") && i % 60 == 0) {
surfWithFlann(matGray.getNativeObjAddr(), image_matches.getNativeObjAddr());
Imgproc.resize(image_matches, image_matches, matGray.size());
banknotes_result_tts = new String(getJniStringBytes(), Charset.forName("UTF-8"));
tts.speak(banknotes_result_tts, TextToSpeech.QUEUE_FLUSH, null);
return image_matches;
}
return matInput;
}
3) Я попытался использовать AsyncTask, и есть функция JNI (surfWithFlann).surfWithFlann сравнивает изображение, полученное камерой, и другие изображения, отправленные из файла ресурсов.Это мой код.
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
matInput = inputFrame.rgba();
Imgproc.cvtColor(matInput, matGray, Imgproc.COLOR_RGB2GRAY);
if(pressedBtn.equals("지폐")) {
try {
image_matches = new SURFAsyncTask().execute(matGray, image_matches).get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return image_matches;
}
return matInput;
}
private class SURFAsyncTask extends AsyncTask<Mat, Void, Mat> {
@Override
protected Mat doInBackground(Mat... mats) {
surfWithFlann(mats[0].getNativeObjAddr(), mats[1].getNativeObjAddr());
Imgproc.resize(mats[1], mats[1], mats[0].size());
banknotes_result_tts = new String(getJniStringBytes(), Charset.forName("UTF-8"));
tts.speak(banknotes_result_tts, TextToSpeech.QUEUE_FLUSH, null);
return mats[1];
}
}
Но три из них не сработали.Экран камеры все еще выглядит изменчивым.Заранее спасибо.