android - 带有 NDK grabCut 的 Android Studio 中的 OpenCV 始终返回黑色掩码

标签 android c++ opencv android-ndk

我使用此示例中的步骤创建了一个支持 NDK 和 OpenCV native 库的 Android Studio 项目:

https://github.com/leadrien/opencv_native_androidstudio

在这个示例运行良好的情况下,我正在尝试使用 grabCut 算法。我的应用程序应该在主 Activity 中显示 3 张图像:原始图像、转换后的图像和使用的蒙版。但实际上显示的蒙版是全黑的,因此,处理后的图像就像原始图像一样。

我的java代码:

    private void processImage(){
    Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pastis);

    Bitmap bmp32 = srcBitmap.copy(Bitmap.Config.ARGB_8888, true);

    Mat imgToProcess = new Mat();
    Mat mask = new Mat();

    //utils from opencv library
    Utils.bitmapToMat(bmp32, imgToProcess);

    //NDK function
    salt(imgToProcess.getNativeObjAddr(), mask.getNativeObjAddr(), 2000);

    Bitmap bmp = Bitmap.createBitmap(imgToProcess.cols(), imgToProcess.rows(), Bitmap.Config.ARGB_8888);

    //utils from opencv library
    Utils.matToBitmap(imgToProcess, bmp);

    Bitmap bmpMask = Bitmap.createBitmap(mask.cols(), mask.rows(), Bitmap.Config.ARGB_8888);

    //utils from opencv library
    Utils.matToBitmap(mask, bmpMask);

    ImageView imageContainer = (ImageView) findViewById(R.id.resultImage);
    imageContainer.setImageBitmap(bmp);

    ImageView maskContainer = (ImageView) findViewById(R.id.maskImage);
    maskContainer.setImageBitmap(bmpMask);
}

我的 NDK 代码是:

void JNICALL Java_com_ach_MainActivity_salt(JNIEnv *env, jobject instance, jlong matAddrGray, jlong mask, jint nbrElem) {
Mat &mGr = *(Mat *) matAddrGray;
Mat &maskR = *(Mat *) mask;

int r = mGr.rows;
int c = mGr.cols;

Mat bgdModel, fgdModel;

Rect rect = Rect(10, 10,c-10, r-10);

cvtColor(mGr , mGr , CV_RGBA2RGB);
maskR.create(mGr.size(), CV_8UC1);

grabCut(mGr, maskR, rect, bgdModel, fgdModel, 2, GC_INIT_WITH_RECT);

mGr.copyTo(mGr, maskR);
}

¿为什么我总是戴全黑面具?

此外,在我的手机(Samsung Galaxy S5)上执行 grabCut 大约需要 50 秒,图像分辨率为 256 x 192,仅需 2 个步骤。 ¿这是正常的吗?¿我该如何改进?

提前致谢:)

最佳答案

我前段时间发现了这个问题,但我忘了发布答案。

似乎 opencv + ndk 中存在一些错误问题,我解决了在 copyTo 函数中不在源和目标处使用相同位图的问题:

mGr.copyTo(mGr, maskR); --> PROBLEMS

mGr.copyTo(mGrDest, maskR); --> WORKING

而且,为了以防万一,由于这个问题,我避免对其他具有源-目标位图的函数(如 cvtColor)进行同样的处理,但我认为该函数没有问题。

我希望我的解决方案适用于您的代码! :)

关于android - 带有 NDK grabCut 的 Android Studio 中的 OpenCV 始终返回黑色掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42552985/

相关文章:

Android 谷歌地图 API : Hide Marker Snippet

c++ - 使用排序功能时应用程序崩溃

opencv - HoughLinesP openCV函数中的多行检测

opencv - 在没有 libopencv-ocl-dev 的情况下安装 libopencv-dev

android - 有没有比使用 Canvas.drawBitmap 更快的绘制位图的方法?

android - 停留在美味的教程上,如何获得 "active access token"?

c++ - 在 parallel_for 中使用函数对象

c - Pthread 程序花费比预期更长的时间

Android Studio 使我的测试模块依赖于应用程序模块

c++ - 在 C++ 中使用多态性和仿函数实现快速性能