我需要先将图像转换为灰度,然后再转换为RGBA才能在其中进行绘制。
当前,我正在使用两个不同的cvtColor调用来完成此操作,尽管在Android(RGBA-> GREY-> RGBA)中性能不佳,但效果很好。
直接从相机获取灰度图像更快,而只需要执行一次cvtColor调用就可以带来很大的不同(GRAY-> RGBA)。
问题是第二种方法使应用程序在几秒钟后关闭。 Android Studio中的logcat不会显示应用程序崩溃,但是在选择了“无过滤器”选项的情况下,它会显示一些错误。这是日志https://pastebin.com/jA7jFSvu。似乎表明OpenCV的摄像头有问题。
下面是两个不同的代码。
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
// Method 1 - works
cameraImage = inputFrame.rgba();
native.exampleProcessImage1(cameraImage.getNativeObjAddr(), cameraImage.getNativeObjAddr());
return cameraImage;
// Method 2 - app closes after a few seconds
cameraImage = inputFrame.gray();
Mat result = new Mat();
native.exampleProcessImage2(cameraImage.getNativeObjAddr(), result.getNativeObjAddr());
return result;
}
这是我在C ++中的代码:
void Java_com_example_native_exampleProcessImage1(JNIEnv *env, jobject instance, jlong sourceImage, jlong destImage) {
// works!
Mat &src = * ((Mat *) sourceImage);
Mat &dest = * ((Mat *) destImage);
Mat pivot;
// src is RGBA
cvtColor(src, pivot, COLOR_RGBA2GRAY);
cvtColor(pivot, dest, COLOR_GRAY2RGBA);
// dest is RGBA
// process
}
void Java_com_example_native_exampleProcessImage2(JNIEnv *env, jobject instance, jlong sourceImage, jlong destImage) {
// does not work
Mat &src = * ((Mat *) sourceImage);
Mat &dest = * ((Mat *) destImage);
// src is GRAY
cvtColor(src, dest, COLOR_GRAY2RGBA);
// dest is RGBA
// process
}
这在Linux和OpenCV上可以正常工作。
您知道我做错了吗?还有另一种方法可以达到相同目的吗?性能是关键,尤其是对于Android设备而言。
谢谢。
答案 0 :(得分:1)
对于第二种情况,您存在内存泄漏,这会导致泄漏
~ 3 sec * fps * frame_resolution * 4 bytes
我认为内存已满后会发生崩溃。
每次result.release();
通话之后,您需要在某个地方致电exampleProcessImage2