Я делаю некоторую работу с OpenCV на Android. Мой код был полностью на интерфейсе Java, и его производительность была очень плохой, поэтому я реализовал почти всю обработку изображений с помощью JNI. Итак, на Java у меня есть:
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame)
{
_imgBgrTemp = inputFrame.rgba();
jniFrame(_imgBgrTemp.nativeObj);
return _imgBgrTemp;
}
Таким образом, функция jniFrame () заботится обо всей обработке изображений в C ++, и это привело к хорошему улучшению производительности. Но это все еще около 8 кадров в секунду, и моя камера может делать 30 кадров в секунду без какой-либо обработки изображения.
Посмотрев поближе, я увидел, что даже при обработке кода он использует только 25% процессора моего Android, ведь это Zenfone 2 с четырехъядерным процессором.
Я думаю о том, чтобы он работал в 4-х потоках, поэтому у меня был бы пул FIFO для получения кадров, обработки и отображения его в полученном порядке.
Я думаю, в использовании это:
Создание менеджера для нескольких потоков
Итак, мои вопросы:
Я иду правильным путем?
Есть ли у вас какие-либо советы ?
Что я должен учитывать (поскольку я работаю с JNI)?
Я не публиковал здесь jniFrame (), потому что я не думаю, что это очень актуально, так как это код незавершенного производства, очень большой. Но речь идет о распознавании кубика Рубика и получении его цветов. если вы также можете дать мне какие-либо советы по этому вопросу … но я могу создать другой вопрос только об этой части позже.
Обновление:
Я просто искал использование OpenCL, но он кажется еще более сложным, чем многопоточность, и я не уверен, что это улучшение будет хорошим. было бы лучше, чем многопоточность?
Задача ещё не решена.
Других решений пока нет …