Esempio n. 1
0
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);
}
Esempio n. 2
0
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, &centroid);

	// 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;
}