Emgu CV画出旋转的矩形

时间:2015-04-13 09:05:42

标签: rotation draw shape emgucv angle

我正在寻找几天在图像框架上绘制矩形的解决方案。基本上我使用CvInvoke.cvRectangle方法在图像上绘制矩形,因为我需要抗锯齿矩形。 但问题是当我需要旋转给定角度的给定形状时。我找不到任何好的解决方案。 我试图在单独的框架上绘制矩形,然后旋转孔框架并将这个新图像应用到我的基础框架上。但在此解决方案中,抗锯齿存在问题。它不起作用。 我正在研究简单的应用程序,它应该允许绘制几种形状,调整它们并旋转给定角度。 知道如何实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

我使用C#和EMGU.CV(4.1),我认为将这些代码传输到任何平台都不会困难。

在助手中添加功能

public static Mat DrawRect(Mat input, RotatedRect rect, MCvScalar color = default(MCvScalar),
        int thickness = 1, LineType lineType = LineType.EightConnected, int shift = 0)
{
    var v = rect.GetVertices();

    var prevPoint = v[0];
    var firstPoint = prevPoint;
    var nextPoint = prevPoint;
    var lastPoint = nextPoint;


    for (var i = 1; i < v.Length; i++)
    {
        nextPoint = v[i];
        CvInvoke.Line(input, Point.Round(prevPoint), Point.Round(nextPoint), color, thickness, lineType, shift);
        prevPoint = nextPoint;
        lastPoint = prevPoint;
    }
    CvInvoke.Line(input, Point.Round(lastPoint), Point.Round(firstPoint), color, thickness, lineType, shift);
    return input;
}

按点绘制死角矩形。在这里,通过方法Point.Round使用的舍入点是因为RotatedRect在浮点坐标中具有点,而CvInvoke.Line将点作为整数。

使用:

    var mat = Mat.Zeros(200, 200, DepthType.Cv8U, 3);
    mat.GetValueRange();
    var rRect = new RotatedRect(new PointF(100, 100), new SizeF(100, 50), 30);
    DrawRect(mat, rRect,new MCvScalar(255,0,0));
    var brect = CvInvoke.BoundingRectangle(new VectorOfPointF(rRect.GetVertices()));
    CvInvoke.Rectangle(mat, brect, new MCvScalar(0,255,0), 1,  LineType.EightConnected, 0);

结果:

enter image description here

答案 1 :(得分:-2)

您应该阅读OpenCV documentation

您可以使用RotatedRectangle课程来完成任务。您可以指定矩形旋转的角度。

以下是绘制旋转矩形的示例代码(取自文档):

Mat image(200, 200, CV_8UC3, Scalar(0));
RotatedRect rRect = RotatedRect(Point2f(100,100), Size2f(100,50), 30);

Point2f vertices[4];
rRect.points(vertices);
for (int i = 0; i < 4; i++)
    line(image, vertices[i], vertices[(i+1)%4], Scalar(0,255,0));

Rect brect = rRect.boundingRect();
rectangle(image, brect, Scalar(255,0,0));

imshow("rectangles", image);
waitKey(0);

结果如下:

rotated rectnagle