Нужно создать серый клон оригинала.
IplImage gray = toGray(img.clone());
Немного сгладить изображение методом медиан
cvSmooth(gray, gray, 3, 7, 7, 3, 3);
Далее нужно отсечь светлую часть изображения
cvThreshold(gray, gray, 150, 255, 1);
И далее найти контуры
cvFindContours(gray, mem, contours, Loader.sizeof(CvContour.class) , RETR_EXTERNAL , CHAIN_APPROX_SIMPLE );
Отрисовка контуров. -1 это заливка сплошным.
cvDrawContours(gray, contours, CvScalar.WHITE, CvScalar.WHITE, 3, -1, 0);
Поиск элипса, который описывает контур.
CvBox2D box1 = cvFitEllipse2(contours);
Весь код.
IplImage gray = toGray(img.clone());
cvSmooth(gray, gray, 3, 7, 7, 3, 3);
cvThreshold(gray, gray, 150, 255, 1);
CvMemStorage mem = CvMemStorage.create();
CvSeq contours = new CvSeq();
cvFindContours(gray, mem, contours, Loader.sizeof(CvContour.class) , RETR_EXTERNAL , CHAIN_APPROX_SIMPLE );
cvDrawContours(gray, contours, CvScalar.WHITE, CvScalar.WHITE, 3, -1, 0);
CvMemStorage storage = CvMemStorage.create();
Point minleft = new Point(0, 0);
while (contours != null && !contours.isNull() && contours.elem_size() > 0) {
CvBox2D box = cvMinAreaRect2(contours, storage);
CvSize2D32f size = box.size();
if (size.width() > 50 && size.height() > 50) {
if (box != null) {
CvBox2D box1 = cvFitEllipse2(contours);
opencv_imgproc.ellipse(cvarrToMat(img), box1.asRotatedRect(),RGB(1,1, 255), -1, 0);
Scalar c = RGB(1,255, 0);
if (minleft.x() == 0 || minleft.x() > box.center().x()) {
minleft.x((int) box.center().x());
minleft.y((int) box.center().y());
}
circle(cvarrToMat(img), new Point(Math.round(box.center().x()), Math.round(box.center().y())), 10, c, CV_FILLED, CV_AA, 0);
}
}
contours = contours.h_next();
}
circle(cvarrToMat(img), minleft, 10, RGB(255,0, 0), CV_FILLED, CV_AA, 0);