Я работаю в проекте, где я снимаю фреймы fps с камеры Android. после того, как каждый кадр преобразуется в Bitmap для использования родной библиотеки с SDK opencv и после того, как это растровое изображение отображается в ImageView. этот процесс потребляет кучу памяти и влияет на производительность приложения. Добавить следующий тег в Manifest.xml увеличить объем памяти кучи:Как я могу обработать кадры с камеры с помощью SurfaceView android
<application
android:name="app"
android:largeHeap="true" />
с этим, приложение отлично работает, когда для создания версии в режиме АПК отладки, но когда для создания версии в режиме АПК релиз , приложение работает очень медленно и не работает нормально, есть проблемы в производительности.
Я работал с логикой с использованием компонента SurfaceView для получения кадров с камеры, я использую SurfaceView, потому что мне нужно использовать в фоновом режиме внутри приложения, я хочу спросить вас, как решить эту проблему, рассчитывая на ваша помощь.
Я использую эту логику, чтобы получить кадры:
public synchronized void onPreviewFrame(final byte[] data, final Camera camera) {
executorService.execute(new Runnable() {
public void run() {
Camera.Parameters parameters = camera.getParameters();
orientation = getOrientationDevice().getOrientation();
orientation = normalize(orientation);
//converter yuv to bitmap
int width = parameters.getPreviewSize().width;
int height = parameters.getPreviewSize().height;
YuvImage yuv = new YuvImage(data,PreviewFormat,width, height, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
yuv.compressToJpeg(new Rect(0, 0, width, height), 80, out);
byte[] bytes = out.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
// rotate image
if (cameraId == Camera.CameraInfo.CAMERA_FACING_FRONT){
matrix.setScale(-1, 1);
matrix.postTranslate(bitmap.getWidth(), 0);
matrix.postRotate(rotation + 90);
} else {
matrix.postRotate(rotation + 90);
}
// process bitmap from method jni
....
// to pass bitmap a ImageView to show
mCameraFrame.onFrame(bitmap.copy(bitmap.getConfig(), false));
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
bitmap = null;
}
camera.addCallbackBuffer(data);
return;
});
}
};
в пользовательском интерфейсе обратного вызова получить растровое изображение, чтобы показать в ImageView
@Override
public void onFrame(final Bitmap mBitmap) {
this.bitmapWeakReference = new WeakReference<Bitmap>(mBitmap);
if (imageViewReference != null && bitmapWeakReference.get() != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmapWeakReference.get());
}
});
}
}
Вы посмотрели примеры, которые поставляются с SDK opencv android? Я считаю, что примеры имеют код для обработки всего этого для вас и предоставляют вам Mat для выполнения любых операций opencv, которые вы хотите на каждом фрейме. – medloh
привет, я пытался использовать opencv для получения кадра, но с этим sdk возникли проблемы, чтобы показать изображение в другой ориентации устройства, потому что я пытаюсь использовать api-камеру Android. – fahoyos127