我正在使用OpenCV尝试在Android上检测对象。问题是相机的屏幕看起来不稳定。
1)我试图降低相机的分辨率。
mOpenCvCameraView.setMaxFrameSize(640, 480);
2)我尝试使用i % 60 == 0
来不每次都在onCameraFrame中调用JNI函数(surfWithFlann)。
@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];
}
}
但是其中三个效果不好。相机屏幕仍然显得不稳定。预先谢谢你。