Я получаю TypeError: требуется целое число (получил тип кортежа) при попытке нарисовать круг в обрезанное окно - PullRequest
1 голос
/ 24 апреля 2019

Я просмотрел другие посты, и ничто, похоже, не решило мою проблему.На данный момент я могу использовать мою функцию mouse_draw_rect, чтобы нарисовать прямоугольник в моем видеопотоке и создать обрезанное окно.Затем я хочу дополнительно нарисовать фигуры в этом обрезанном окне, но когда я пытаюсь вызвать мою select_point функцию, моя программа падает, и я получаю следующее: TypeError: an integer is required (got type tuple).Ошибка происходит в строке кода cv2.circle(cropped_window,point,(0,0,255),2).

Вот мой следующий код, который можно запустить с помощью opencv:

import cv2

cap = cv2.VideoCapture(0)
_, first_frame = cap.read()


def mouse_draw_rect(event, x, y, flags, params):
    global point1, point2, drawing, first_frame
    if event == cv2.EVENT_LBUTTONDOWN:
        if drawing is False:
            drawing = True
            point1 = ()
            point2 = ()
            point1 = (x, y)
            print(point1)
            print(point2)
        else:
            drawing = False

    elif event == cv2.EVENT_LBUTTONUP:
        if drawing is True:
            point2 = (x, y)
            drawing = False

def select_point(event, x, y, flags, params):
    global point, point_selected
    if event == cv2.EVENT_MBUTTONDOWN:
        point = (x, y)
        point_selected = True
        print(point)

drawing = False
point_selected = False

point1 = ()
point2 = ()
point = ()

cv2.namedWindow('Original')

cv2.setMouseCallback("Original", mouse_draw_rect)

while True:

    ret, frame = cap.read( )

    if point1 and point2:
        cv2.rectangle(frame, point1, point2, (0, 0, 0), 2)
        first_frame_roi = first_frame[point1[1]:point2[1], point1[0]:point2[0]]
        cropped_window = frame[point1[1]:point2[1], point1[0]:point2[0], :]

        cv2.imshow('Cropped Window', cropped_window)

        cv2.namedWindow('Cropped Window')
        cv2.setMouseCallback("Cropped Window", select_point)
        if point_selected is True:
            cv2.circle(cropped_window,point,(0,0,255),2)

    cv2.imshow('Original', frame)


    key = cv2.waitKey(30) & 0xff
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

Дайте мне знать, если вам потребуется дополнительная информация.

1 Ответ

1 голос
/ 24 апреля 2019

Согласно документации:

cv2.circle (img, центр, радиус, цвет [, толщина [, lineType [, shift]]]) → img

Третий аргумент - это радиус, который, как ожидается, будет числом (в данном случае целым числом), а не кортежем.Я думаю, что вы использовали аргументы в неправильном порядке в вашем вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...