在Android Studio中使用NDK GrabCut返回的OpenCV总是黑色面具

OpenCV in Android Studio with NDK grabCut returns always black mask

本文关键字:OpenCV 面具 黑色 返回 GrabCut Studio Android NDK      更新时间:2023-10-16

我使用此示例中的步骤创建了一个具有NDK支持和OPENCV本机库的Android Studio项目:

https://github.com/leadrien/opencv_native_androidstudio

在此示例正常工作的情况下,我正在尝试使用GrabCut算法。我的应用程序应在主要活动中显示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);
}

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

此外,在我的手机(三星Galaxy S5)中执行大约50秒钟的图像分辨率为256 x 192,只有2个步骤。这是正常的吗?

预先感谢:)

我很久以前发现了这个问题,但我忘了发布答案。

OPENCV NDK中的某些错误似乎存在问题,我解决了我的问题在 copyto 函数中使用源和目标的相同位图:

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

,并且,以防万一,由于这个问题,我避免使用源源可测点图的其他功能,例如 cvtcolor ,但我认为该功能没有问题。

>

我希望我的解决方案可以与您的代码一起使用!:)