黒いコイン内の白い穴を埋めることに問題があるため、塗りつぶされた黒いコインで 0 ~ 255 のバイナリ イメージしか持てません。メディアン フィルターを使用してそれを達成しましたが、その場合、コイン間の接続ブリッジが大きくなり、不可能になります。数回の浸食後にそれらを認識するために...だから、opencvで簡単なfloodFillのようなメソッドが必要です
穴のある私の画像は次のとおりです。
編集:フラッドフィルのような関数は、シードとして X、Y 座標を要求することなく、大きなコンポーネントの穴を埋めなければなりません...
編集: cvDrawContours 関数を使用しようとしましたが、大きな輪郭内の輪郭を塗りつぶしません。
これが私のコードです:
CvMemStorage mem = cvCreateMemStorage(0);
CvSeq contours = new CvSeq();
CvSeq ptr = new CvSeq();
int sizeofCvContour = Loader.sizeof(CvContour.class);
cvThreshold(gray, gray, 150, 255, CV_THRESH_BINARY_INV);
int numOfContours = cvFindContours(gray, mem, contours, sizeofCvContour, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
System.out.println("The num of contours: "+numOfContours); //prints 87, ok
Random rand = new Random();
for (ptr = contours; ptr != null; ptr = ptr.h_next()) {
Color randomColor = new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
CvScalar color = CV_RGB( randomColor.getRed(), randomColor.getGreen(), randomColor.getBlue());
cvDrawContours(gray, ptr, color, color, -1, CV_FILLED, 8);
}
CanvasFrame canvas6 = new CanvasFrame("drawContours");
canvas6.showImage(gray);
結果: (各コインの中にブラックホールが見えます)