Понимание параметров эллипса в Open CV с использованием Python - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь нарисовать дугу, используя Open CV, используя функцию cv2.ellipse Я попытался прочитать документацию для того же, но я нахожу это очень запутанным. В моем случае это дуга, поэтому 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()

Когда мой начальный угол равен 135, а конечный угол равен 180, результат выглядит как enter image description here

тогда как когда startAngle равен 0, а endAngle равен 90, результат выглядит следующим образом enter image description here

Так что это сбивает с толку, в каком направлении вращается дуга.

1 Ответ

1 голос
/ 17 июня 2019

Вы можете действительно легко увидеть, как изменение параметров влияет на рисование эллипса. Вот простой код для этого:

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

Давайте рассмотрим параметры:

center -> x и y кортеж, где центр эллипса.

оси -> радиус первой и второй осей (половина общего размера). Первый - горизонтальный, если применяется угол 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))

Если у вас есть сомнения по поводу любого из них, не стесняйтесь спрашивать в комментарии

...