0

My goal is to find closed regions within my black and white image. I'm using android studio. After following this answer, I was able to come up with this code.

public class MainActivity extends AppCompatActivity {

    Mat src,original;

    Bitmap invertedColorBitmap;

    ImageView preview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (!OpenCVLoader.initDebug()) {
            Log.v("Error", "Error");
        }

        preview= (ImageView) findViewById(R.id.iv_hello_image);

        try {
            original=src= Utils.loadResource(MainActivity.this, R.drawable.heart);

            //Get inverted image
            Mat invertcolormatrix= new Mat(src.rows(),src.cols(), src.type(), new Scalar(255,255,255));
            Core.subtract(invertcolormatrix, src, src);

            //Erode
            Imgproc.erode(src, src, new Mat());

            //Grab cut
            Mat GC_PR_BGD=new Mat(src.rows(),src.cols(), src.type(), new Scalar(0,0,255)),GC_PR_FGD=new Mat(src.rows(),src.cols(), src.type(), new Scalar(255,0,0));
            Mat mask=new Mat(src.height(),src.width(), CvType.CV_8U);

            GC_PR_BGD.copyTo(mask);
            GC_PR_FGD.copyTo(mask, src);

            Mat bgdModel=new Mat(), fgdModel=new Mat();

            Imgproc.cvtColor(original,original, Imgproc.COLOR_BGR2GRAY);
            Imgproc.grabCut(original, mask, new Rect(), bgdModel, fgdModel, Imgproc.GC_INIT_WITH_MASK);

            //Find contours (Boundaries of foreground)
            List<MatOfPoint> contours=new ArrayList<>();
            Mat hierarchy=new Mat();
            Imgproc.findContours(original, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

            Log.v("Contour size", "contours : " + contours.size());
            for(int idx = 0; idx < contours.size(); idx++) {
                Imgproc.drawContours(original, contours, idx, new Scalar(255, 0, 0), 2);
            }

            //Got contours for image
            invertedColorBitmap=Bitmap.createBitmap(original.cols(),original.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(original,invertedColorBitmap);
            preview.setImageBitmap(invertedColorBitmap);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

I'm currently stuck in Grabcut part of code, where I get this error

12-20 02:39:44.127 663-663/btdw.agilan.opencvapp E/cv::error(): OpenCV Error: Assertion failed (scn == 3 || scn == 4) in void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int), file /builds/master_pack-android/opencv/modules/imgproc/src/color.cpp, line 7564
12-20 02:39:44.127 663-663/btdw.agilan.opencvapp E/org.opencv.imgproc: imgproc::cvtColor_11() caught cv::Exception: /builds/master_pack-android/opencv/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int)
12-20 02:39:44.127 663-663/btdw.agilan.opencvapp W/System.err: CvException [org.opencv.core.CvException: cv::Exception: /builds/master_pack-android/opencv/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int)
12-20 02:39:44.127 663-663/btdw.agilan.opencvapp W/System.err: ]
12-20 02:39:44.127 663-663/btdw.agilan.opencvapp W/System.err:     at org.opencv.imgproc.Imgproc.cvtColor_1(Native Method)
12-20 02:39:44.127 663-663/btdw.agilan.opencvapp W/System.err:     at org.opencv.imgproc.Imgproc.cvtColor(Imgproc.java:2045)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at btdw.agilan.opencvapp.MainActivity.onCreate(MainActivity.java:79)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at android.app.Activity.performCreate(Activity.java:6237)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at android.app.ActivityThread.-wrap11(ActivityThread.java)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at android.os.Looper.loop(Looper.java:148)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
12-20 02:39:44.128 663-663/btdw.agilan.opencvapp W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

I checked with the solutions from other similar questions but did not fit my implementation. Here is the image I use,

enter image description here

Community
  • 1
  • 1
abtdw
  • 165
  • 2
  • 12
  • Possible duplicate of [How to interpret c++ opencv Assertion error messages due to an error in cvtColor function?](http://stackoverflow.com/questions/32027849/how-to-interpret-c-opencv-assertion-error-messages-due-to-an-error-in-cvtcolor) – Miki Dec 20 '15 at 11:04
  • Your image is probably already loaded as grayscale.. And the conversion from BGR to GRAY will fail at this line: `Imgproc.cvtColor(original,original, Imgproc.COLOR_BGR2GRAY);` – Miki Dec 20 '15 at 11:06
  • @Miki When I skip that line I get this error, CvException [org.opencv.core.CvException: cv::Exception: /builds/master_pack-android/opencv/modules/imgproc/src/grabcut.cpp:540: error: (-5) image mush have CV_8UC3 type in function void cv::grabCut(cv::InputArray, cv::InputOutputArray, cv::Rect, cv::InputOutputArray, cv::InputOutputArray, int, int) – abtdw Dec 20 '15 at 11:36
  • Because `original` must be a 3 channel matrix `CV_8UC3`. You can correct both issues changing the conversion line to: `Imgproc.cvtColor(original,original, Imgproc.COLOR_GRAY2BGR);` – Miki Dec 20 '15 at 18:59

0 Answers0