Поиск контуров. Глаза для робота сортировщика.
29 10 2017 admin Пока нет комментариевНужно создать серый клон оригинала.
1 2 3 |
IplImage gray = toGray(img.clone()); |
Немного сгладить изображение методом медиан
1 2 3 |
cvSmooth(gray, gray, 3, 7, 7, 3, 3); |
Далее нужно отсечь светлую часть изображения
1 2 3 |
cvThreshold(gray, gray, 150, 255, 1); |
И далее найти контуры
1 2 3 |
cvFindContours(gray, mem, contours, Loader.sizeof(CvContour.class) , RETR_EXTERNAL , CHAIN_APPROX_SIMPLE ); |
Отрисовка контуров. -1 это заливка сплошным.
1 2 3 |
cvDrawContours(gray, contours, CvScalar.WHITE, CvScalar.WHITE, 3, -1, 0); |
Поиск элипса, который описывает контур.
1 2 3 |
CvBox2D box1 = cvFitEllipse2(contours); |
Весь код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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); |