Поиск контуров. Глаза для робота сортировщика

Нужно создать серый клон оригинала.

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);
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: