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,