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