用Python理解Open-CV中的椭圆参数

2024-09-28 17:23:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用开CV,用cv2.elliple函数画一条弧 我试着读了同样的文档,但是我发现它非常混乱。在我的例子中,这是一个弧,所以轴的x和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时,结果看起来像enter image description here

而当startAngle为0且endAngle为90时,结果看起来像 enter image description here

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


Tags: imagenpwidthcv2cvcolorcenterheight
1条回答
网友
1楼 · 发布于 2024-09-28 17:23:23

你可以很容易地看到参数的变化如何影响椭圆的绘制。下面是一个简单的代码:

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()

这将执行以下操作:

enter image description here

让我们来看看这些参数:

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

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

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

startAngle->;开始绘制圆弧的位置,例如0将与示例图像(在第一个轴上)类似,但如果角度有值,则0将以相同的方式旋转。在

endAngle->;在您想要停止绘制的地方,您可以看到我在示例中改变了它,以绘制一个增加的椭圆。在

如果你想要一个半径为50px的圆的弧,比如从60度到120度,但是逆时针方向(360度-开始/结束角度),你可以:

^{pr2}$

如果你对他们中的任何一个有疑问,请随时发表评论

相关问题 更多 >