Я использую библиотеку 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
. Но это не помогло.
Может кто-нибудь помочь?