簡體   English   中英

具有NDK抓取功能的Android Studio中的OpenCV始終返回黑色蒙版

[英]OpenCV in Android Studio with NDK grabCut returns always black mask

我使用此示例中的步驟創建了一個具有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);
}

¿為什么我總是得到全黑的口罩?

此外,在我的手機(Samsung Galaxy S5)中以大約50秒鍾的時間執行grapCut,圖像分辨率為256 x 192,僅執行2步。 這是正常現象嗎?該如何改善?

提前致謝 :)

我前段時間發現了問題,但忘了發布答案。

看來在opencv + ndk中存在一些錯誤的問題,我解決了我的問題,即在copyTo函數的源和目標上不使用相同的位圖:

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

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

而且,以防萬一,由於這個問題,對於具有源目標位圖的其他函數,例如cvtColor ,我避免使用相同的函數,但是我認為該函數沒有問題。

希望我的解決方案能與您的代碼一起使用! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM