【问题标题】:OpenCV Native Android cvtColor crashOpenCV Native Android cvtColor 崩溃
【发布时间】:2018-07-25 13:46:26
【问题描述】:

我需要将图像转换为灰度,然后再转换回 RGBA 才能在其中绘图。

目前,我正在使用两个不同的 cvtColor 调用,虽然在 Android 中性能不佳(RGBA -> GREY -> RGBA),但效果很好。

直接从相机获取灰度图像更快,并且只需调用一次 cvtColor 就会产生巨大的差异(GRAY -> RGBA)。

问题是第二种方法会使应用程序在几秒钟后关闭。 Android Studio 中的 logcat 不会显示应用程序崩溃,但在选择 No Filters 选项时会显示一些错误。这是日志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 设备。

提前谢谢你。

【问题讨论】:

    标签: android c++ opencv opencv4android


    【解决方案1】:

    对于第二种情况,您有内存泄漏,这会导致泄漏
    ~ 3 sec * fps * frame_resolution * 4 bytes

    我认为内存已满后会发生崩溃。

    您需要在每次exampleProcessImage2 呼叫之后的某个地方呼叫result.release();

    【讨论】:

    • 谢谢,您的建议为我指明了正确的方向。不知道要释放内存,报错也不是很清楚。
    猜你喜欢
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2021-03-04
    • 2019-08-07
    相关资源
    最近更新 更多