使用 Python 了解 Open CV 中的椭圆参数

Understanding the ellipse parameters in Open CV using Python

我正在尝试使用 cv2.ellipse 函数使用 Open CV 绘制弧线 我试着阅读相同的文档,但我发现它非常混乱。在我的例子中这是一条弧线,所以 axes_x 和 axes_y 是相同的,即半径。我的轴应该是什么,我应该在哪个方向计算开始和结束角度?这个旋转角度是多少? 给定的是功能 - cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])

import cv2
import numpy as np

def create_blank(height, width, color):

    blank_image = np.zeros((int(height), int(width), 3), np.uint8)
    blank_image[:, :] = color
    return blank_image

def draw_arc(image):
    height, width = image.shape[0:2]
    # Ellipse parameters
    radius = 100
    center = (width / 2, height/2)
    axes = (radius, radius)
    angle = 0
    startAngle = 135
    endAngle = 180
    cv2.line(image, (0, 150), (300, 150), (0, 0, 0), 2, cv2.CV_AA)
    cv2.line(image, (150, 0), (150, 300), (0, 0, 0), 2, cv2.CV_AA)
    cv2.ellipse(image, center, axes, angle, startAngle, endAngle, (0, 0, 0), 2, cv2.CV_AA)
    cv2.imshow("ellipse", image)


# Create new blank 300x150 white image
width, height = 300, 300
image = create_blank(width, height, color=WHITE)
draw_arc(image)

cv2.waitKey(0)
cv2.destroyAllWindows()

当我的 startAngle 为 135,endAngle 为 180 时,结果看起来像

而当 startAngle 为 0 且 endAngle 为 90 时,结果如下所示

所以这让人很困惑,圆弧在哪个方向旋转。

您可以真正轻松地查看参数的变化如何影响椭圆的绘制。这是一个简单的代码:

import numpy as np
import cv2

center = (200, 200) # x,y
axes = (100, 75) # first, second
angle = 0. # clockwise, first axis, starts horizontal
for i in range(360):
  image = np.zeros((400, 400, 3)) # creates a black image
  image = cv2.ellipse(image, center, axes, angle, 0., 360, (0,0,255))
  image = cv2.ellipse(image, center, axes, angle, 0., i, (0,255,0))
  cv2.imshow("image", image)
  cv2.waitKey(5)

cv2.waitKey(0)
cv2.destroyAllWindows()

这将执行如下操作:

让我们检查一下参数:

center -> 椭圆中心所在的 x 和 y 元组。

axes -> 第一轴和第二轴半径(总尺寸的一半)。如果角度为0,第一个是水平的,第二个是垂直的。

angle -> 整个椭圆的角度,即顺时针移动第一个轴

startAngle -> 你想开始画弧的地方,例如 0 就像我的示例图像(在第一轴),但如果角度有一个值, 则 0 将以相同的方式旋转。

endAngle -> 在你想停止绘制的地方,你可以看到我在我的例子中改变它来绘制一个增加的椭圆。

如果你想要一个半径为 50px 的圆弧,比如说从 60 度到 120 度,但逆时针方向 (360 - start/endAngle) 你可以这样做:

image = cv2.ellipse(image, (100,100), (50,50), 0.0, 360-120, 360-60, (0,255,0))

如果您对其中任何一个有疑问,请随时在评论中提问