2017-03-02 5 views
2

を返し、私はこの例の手順を使用して、NDKのサポートとOpenCVのネイティブライブラリとのAndroid Studioプロジェクトを作成しました:OpenCVのいつものブラックマスク

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); 
} 

¿私はいつもオールブラックマスクを取得していますなぜ?

さらに、画像解像度が256 x 192で2ステップしかない携帯電話(Samsung Galaxy S5)で約50秒かかるgrabCutを実行します。 ¿これは正常ですか?¿これを改善するにはどうしたらいいですか?事前に

感謝:)

答えて

0

私はいくつかの時間前に問題を発見したが、私は答えを投稿するのを忘れました。

そこにいくつかのバグに問題がOpenCVの+ NDKにあったと私はのcopyTo機能で、ソースと宛先で同じビットマップを使用していない私の問題を解決しているようです:

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

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

そして、念のためにこの問題は、cvtColorのようなソースとデスティネーションのビットマップを持つ他の関数では同じことを避けることができますが、その関数には問題はないと思います。

私のソリューションはあなたのコードで動作することを願っています! :)

関連する問題