void Storage::paintEvent(QPaintEvent *anEvent) { QLabel::paintEvent(anEvent); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); //painter.setRenderHint(QPainter::SmoothPixmapTransform); QPen pen; if (NoTool != tool_) { pen.setWidth(5); pen.setColor(QColor(Qt::white)); pen.setStyle(Qt::DashLine); painter.setPen(pen); if (BoundingBoxTool == tool_) { /* с учётом масштаба */ QRect bbox = rect.getCoordinates(); QPoint bboxTopLeft = bbox.topLeft() * scale_; QPoint bboxBottomRight = bbox.bottomRight() * scale_; bbox.setTopLeft(bboxTopLeft); bbox.setBottomRight(bboxBottomRight); painter.drawRect(bbox); } else if (EllipseTool == tool_) { /* с учётом масштаба */ QRect elli = ell.getCoordinates().normalized(); QPoint ellTopLeft = elli.topLeft() * scale_; QPoint ellBottomRight = elli.bottomRight() * scale_; elli.setTopLeft(ellTopLeft); elli.setBottomRight(ellBottomRight); if(1 < elli.height() && 1 < elli.width() ) { painter.drawEllipse(elli); } // painter.drawRect(ell); } else if (ArrowTool == tool_) { /* с учётом масштаба */ QLineF line = arrow.getCoordinates(); QPointF p1 = line.p1() * scale_; QPointF p2 = line.p2() * scale_; line.setP1(p1); line.setP2(p2); if(1 < line.length()) { double angle = ::acos(line.dx() / line.length()); qreal Pi = atan(1)*4; if (line.dy() >= 0) angle = (Pi * 2) - angle; QPointF arrowP1 = line.p1() + QPointF(sin(angle + Pi / 3) * arrow_size_, cos(angle + Pi / 3) * arrow_size_); QPointF arrowP2 = line.p1() + QPointF(sin(angle + Pi - Pi / 3) * arrow_size_, cos(angle + Pi - Pi / 3) * arrow_size_); QPolygonF arrowTop; arrowTop.clear(); arrowTop << line.p1() << arrowP1 << arrowP2; painter.drawLine(line); painter.drawPolygon(arrowTop);///111 qDebug() << "arrowTop" << arrowTop; arrow_top_ = arrowTop; } } else if (PolygonTool == tool_) { /* с учётом масштаба */ QPoint point; QPolygon pol = poly.getCoordinates(); for (int i = 0; i < pol.size(); i++) { point.setX(pol.at(i).x()); point.setY(pol.at(i).y()); point *= scale_; pol.remove(i); pol.insert(i, point); } painter.drawPolygon(pol); } } /* рисуем фигуры */ drawBoundingBoxes(&painter, &pen); drawPolygons(&painter, &pen); drawEllipses(&painter, &pen); drawArrows(&painter, &pen); }
CvBox2D findPupil(IplImage* cvImg) { double minScore = -1; CvBox2D pupil; int numOfEllipses = 0; CvBox2D ellipses[ELLIPSE_MAX_NUM]; Line *ellipseLines[ELLIPSE_MAX_NUM]; CvPoint2D32f centroid; CvPoint2D32f dummy_centroid = cvPoint2D32f(ROI_SIZE, ROI_SIZE); findEllipsesFromImage(cvImg, &numOfEllipses, ellipses, ellipseLines, ¢roid); // detect faileure pupil.size.width = -1; if (CANDIDATE_TEST == 1) { printf("num of ellipse : %d\n", numOfEllipses); drawEllipses(cvImg, numOfEllipses, ellipses); } int i, n; int numOfCombinations = pow(2,numOfEllipses); for (n=1; n<numOfCombinations; n++) { int cnt = 0; int li, ln, len; Line *line = (Line *) malloc (sizeof(Line)); line->length = 0; for (ln=0, li=n; li>0; ln++, li/=2) { if (li%2) { line->length += ellipseLines[ln]->length; } } line->pixels = (GPixel *) malloc (sizeof(GPixel)*line->length); for (ln=0, li=n; li>0; ln++, li/=2) { if (li%2) { for (len=0; len<ellipseLines[ln]->length; len++) { line->pixels[cnt++] = ellipseLines[ln]->pixels[len]; } } } CvBox2D ellipse = getEllipseFromLine(line); if (myContains(dummy_centroid, ellipse)) { double score = scoreOfEllipse(line, ellipse); if (CANDIDATE_TEST == 2) { drawEllipse(ellipse, cvImg); } if (minScore < 0 || score < minScore) { if (averageRadius(ellipse) > CANDIDATE_MIN_RADIUS && largeRadius(ellipse) < CANDIDATE_MAX_RADIUS) { minScore = score; pupil = ellipse; } } } free(line->pixels); free(line); } for (i=0; i<numOfEllipses; i++) { free(ellipseLines[i]->pixels); free(ellipseLines[i]); } pupil.center.x += (centroid.x-ROI_SIZE); pupil.center.y += (centroid.y-ROI_SIZE); return pupil; }