Я разрабатываю прототип приложения, используя камеру глубины танго для сопоставления шаблонов. До сих пор мне удавалось решать все проблемы с помощью уже отвеченных вопросов, документации и т. д.
Однако сейчас я, кажется, остановился. Последнее крупное изменение, которое я сделал, заключалось в том, чтобы нарисовать контур на изображении предварительного просмотра камеры перед его отображением. Что бы я ни делал сейчас, приложение какое-то время работает, прежде чем вылетит.
Я просмотрел дампы кучи и отслеживание распределения в Android Studio. Единственная, возможно, странная вещь заключается в том, что в объектах FinalizerReference в дампе кучи может быть много памяти...
Я также попытался перенести обработку в AsyncTask и просто пропустить каждый цветной кадр, пока задача не будет выполнена (чтобы одновременно выполнялась только одна задача) и отображался обработанный кадр, но проблема осталась.
Я использую Google Tango для получения данных камеры цвета и глубины и opencv в java для анализа данных и сопоставления шаблонов.
Кто-нибудь знает, что означают эти сообщения logcat?
Ошибки логката:
Код для отображения предварительного просмотра камеры:
Здесь потенциально могут произойти две вещи:
mTango.experimentalConnectOnFrameListener(TangoCameraIntrinsics.TANGO_CAMERA_COLOR, new Tango.OnFrameAvailableListener() {
byte[] imageByteArray = new byte[colorCameraIntrinsics.height * colorCameraIntrinsics.width * 3 / 2];
Mat yuvMat = new Mat( colorCameraIntrinsics.height + colorCameraIntrinsics.height/2, colorCameraIntrinsics.width, CvType.CV_8UC1 );
Bitmap bitmapDisplay = Bitmap.createBitmap( colorCameraIntrinsics.width, colorCameraIntrinsics.height, Bitmap.Config.ARGB_8888 );
Mat colorMatDisplay;
@Override
public void onFrameAvailable(TangoImageBuffer imageBuffer, int cameraId) {
Log.d(TAG, "onFrameAvailable: color frame available");
if (colorFrameCounter < 3) { //only use every 3rd frame
Log.d(TAG, "onFrameAvailable: skipping frame " + colorFrameCounter);
colorFrameCounter++;
} else {
colorFrameCounter = 0;
if (!stopCameraView.get()) { // Only view frame if camera view is not stopped
// convert image buffer data to byte array
imageBuffer.data.get(imageByteArray);
// byte array to Mat object with YUV coding (NV21)
yuvMat.put(0, 0, imageByteArray);
// locking access to lastColorFrameMat
synchronized (lockVar) {
Log.d(TAG, "onFrameAvailable: converting to bitmap");
// convert from YUV (NV21) Mat to RGBA Mat and place in lastColorFrameMat (global)
Imgproc.cvtColor(yuvMat, lastColorFrameMat, Imgproc.COLOR_YUV2RGBA_NV21, 4);
colorMatDisplay = lastColorFrameMat.clone();
}
if (templateContours != null) {
Imgproc.drawContours(colorMatDisplay, templateContours, templateContourMaxIdx, new Scalar(0, 255, 0, 255), 5);
}
// convert colorMatDisplay to bitmap, for display in imageview
Utils.matToBitmap(colorMatDisplay, bitmapDisplay);
Log.d(TAG, "onFrameAvailable: view lastColorFrameMat on phone display");
// View colorImage in imageViewer on UI thread
runOnUiThread(new Runnable() {
@Override
public void run() {
imageViewer.setImageBitmap(bitmapDisplay);
}
});
}
}
}
});