OpenCV: как нарисовать сегмент круга на изображении с помощью мышиных обратных вызовов - PullRequest
0 голосов
/ 19 мая 2019

Я использую библиотеку openCV в Python. Я хочу открыть изображение, щелкнуть три разных точки, и из них создать сегмент круга.

Первая нажатая точка - центр круга. Следующая нажатая точка определяет начало сегмента, а последняя нажатая точка определяет конец сегмента.

Я немного растерялся из-за того, как это сделать, поскольку функция cv2.ellipse требует информации об угле, которую я не знаю, как получить по щелчкам мыши.

Вот моя первоначальная идея:

def draw_circleSegment (событие, x, y, флаги, параметр):

global center_pt, upper_pt, center_clicked, upper_clicked

#right mouse click
if event == cv2.EVENT_RBUTTONDOWN:
    #reset
    if center_clicked and upper_clicked:
        center_clicked = False
        upper_clicked = False
        center_pt = (0,0)
        upper_clicked = (0,0)
    #get coordinates of circle center
    if not center_clicked:
        center_pt = tuple(int(el) for el in (x,y))
        center_clicked = True
    #get coordinates of upper point of the circle segment
    if not upper_clicked:
        upper_pt = tuple(int(el) for el in(x,y))
        upper_clicked = True

#initial values of the circle segment
center_pt = (0,0)
upper_pt = (0,0)
center_clicked = False
upper_clicked = False

#capture video
cap = cv2.VideoCapture(r'Path')
cv2.namedWindow(winname='Window Name')
cv2.setMouseCallback('Window Name', draw_circleSegment)

while True: 
    ret_frame, frame = cap.read()

    #draw a circle segment whose points are defined by right mouse click   
    if center_clicked and upper_clicked: 
        cv2.line(frame, center_pt, upper_pt, (255,0,0), 2)
        SegmentAngle=math.degrees(math.atan2(upper_pt[1]-center_pt[1], upper_pt[0]-center_pt[0]))
        radius = int(math.sqrt((upper_pt[0]-center_pt[0])**2 + (upper_pt[1]-center_pt[1])**2))
        cv2.ellipse(frame, center_pt, axes=(radius, radius), angle=SegmentAngle, startAngle=SegmentAngle, endAngle=SegmentAngle+180, thickness=2)
        lower_pt = (upper_pt[0], upper_pt[1]-radius)
            cv2.line(frame, center_pt, lower_ppt, (255,0,0), 2)
        break

Таким образом, при выполнении этого кода я получаю сообщение об ошибке «TypeError: ellipse () принимает не более 5 аргументов (дано 7)» ... и я думаю, что это означает, что по крайней мере один из аргументов эллипса имеет неправильный тип , Вот почему я выполнил эти странные приведения к целочисленным значениям для center_pt и upper_pt и radius. Но это не помогло.

Может кто-нибудь помочь?

...