首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有NDK grabCut的Android中的OpenCV总是返回黑色掩码

带有NDK grabCut的Android中的OpenCV总是返回黑色掩码
EN

Stack Overflow用户
提问于 2017-03-02 10:35:12
回答 1查看 599关注 0票数 2

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

androidstudio

由于这个示例运行良好,我尝试使用grabCut算法。我的应用程序应该在主要活动中显示3个图像:原始图像、转换图像和使用的掩码。但实际上,显示的面具都是黑色的,因此,处理后的图像就像原来的一样。

我的java代码:

代码语言:javascript
复制
    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代码是:

代码语言:javascript
复制
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);
}

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

此外,在我的手机(三星GalaxyS5)中执行grabCut大约需要50秒,图像分辨率为256 x 192,只需2步。这正常吗?我该怎么改进呢?

(预先谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-17 06:26:57

我不久前发现了这个问题,但我忘了贴出答案。

似乎opencv + ndk中存在一些bug,我解决了在copyTo函数中没有在源和目的地使用相同位图的问题:

代码语言:javascript
复制
mGr.copyTo(mGr, maskR); --> PROBLEMS

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

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

我希望我的解决方案适用于你的密码!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42552985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档