«Это 28-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."
Динамическое рисование с использованием событий мыши
Для использованияOpenCV
Рисуя графику и текст, мы с ним уже знакомы. В этой статье мы будем использоватьOpenCV
Функции рисования в , узнайте, как использовать события мыши для выполнения динамического рисования.
Динамическое рисование графики
Чтобы использовать события мыши для динамического рисования, мы должны сначала понять, как использоватьOpenCV
обрабатывать события мыши, вOpenCV
используется вcv2.setMouseCallback()
Функция выполняет эту функцию, использование функции выглядит следующим образом:
cv2.setMouseCallback(windowName, onMouse, param=None)
Эта функция называетсяwindowName
Окно создает обработчик мыши,onMouse
Функции — это функции обратного вызова, которые вызываются, когда происходит событие мыши (например, двойной щелчок, нажатие левой кнопки, нажатие левой кнопки и т. д.); необязательный параметр param используется для передачи дополнительной информации в функцию обратного вызова.
Итак, для обработки событий мыши первым шагом является создание функции обратного вызова:
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
print("event: EVENT_LBUTTONDBLCLK")
cv2.circle(image, (x, y), 20, colors['magenta'], -1)
if event == cv2.EVENT_MOUSEMOVE:
print("event: EVENT_MOUSEMOVE")
if event == cv2.EVENT_LBUTTONUP:
print("event: EVENT_LBUTTONUP")
if event == cv2.EVENT_LBUTTONDOWN:
print("event: EVENT_LBUTTONDOWN")
cv2.rectangle(image,(x,y),(x+20,y+20),colors['cyan'],1)
draw_circle()
Функция получает определенные события и координаты (x, y) каждого события мыши, а при выполнении щелчка левой кнопкой мыши (cv2.EVENT_LBUTTONDBLCLK
), мы в соответствующем событии(x, y)
рисует окружность по координатам, а при выполнении щелчка левой кнопкой мыши (cv2.EVENT_LBUTTONDOWN
), когда соответствующий(x, y)
Нарисуйте квадрат в координатах. Кроме того, мы печатаем некоторые сообщения, чтобы увидеть другие сгенерированные события, но пока не используем их ни для чего другого.
Далее создайте именованное окно, назовите егоMouse event
. Это окно именомому будет связано с функцией обратного вызова мыши:
cv2.namedWindow('Image mouse')
Наконец, установите функцию обратного вызова мыши на функцию, которую мы создали ранее:
cv2.setMouseCallback('Image mouse', draw_circle)
В этот момент при двойном щелчке левой кнопкой мыши выполняется двойной щелчок.(x, y)
Нарисуйте закрашенный пурпурный круг в центре, когда выполняется щелчок левой кнопкой мыши, в соответствующем(x, y)
Нарисуйте квадрат в координатах.
Динамическое рисование графики и текста
В этой практичной программе графика и текст динамически рисуются в сочетании с событиями мыши. Сначала нарисуйте текст, чтобы показать, как использовать события мыши для выполнения определенного действия:
def draw_text():
# We set the position to be used for drawing text:
menu_pos = (10, 540)
menu_pos2 = (10, 555)
menu_pos3 = (10, 570)
menu_pos4 = (10, 585)
# 绘制文本以显示如何使用鼠标事件来执行特定操作
cv2.putText(image, 'Double left click: add a circle', menu_pos, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
cv2.putText(image, 'Simple right click: delete last circle', menu_pos2, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
cv2.putText(image, 'Double right click: delete all circle', menu_pos3, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
cv2.putText(image, 'Press \'q\' to exit', menu_pos4, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
Из приведенного выше кода мы знаем, что код должен реализовать следующие операции:
- Добавьте круг двойным щелчком левой кнопки и одновременно отобразите координаты центра круга
- Используйте правый клик, чтобы удалить последний добавленный круг
- Удалить все круги двойным щелчком правой кнопкой мыши
Для реализации этих функций мы сначала создадимcircles
Список, где мы сохраняем текущий круг, нарисованный пользователем. Дополнительно мы создаем резервные изображения с отрендеренным текстом. Когда происходит событие мыши, мы добавляем или удаляем круги и текст из списка кругов. После этого при рисовании мы отрисовываем только текущую окружность в списке и текст ее центральной позиции, а когда пользователь выполняет правый клик, последняя добавленная окружность удаляется из списка.
def draw_circle(event, x, y, flags, param):
global circles
if event == cv2.EVENT_LBUTTONDBLCLK:
# 将圆心坐标添加到列表中
print("event: EVENT_LBUTTONDBLCLK")
circles.append((x, y))
if event == cv2.EVENT_RBUTTONDBLCLK:
# 删除所有圆形
print("event: EVENT_RBUTTONDBLCLK")
circles[:] = []
elif event == cv2.EVENT_RBUTTONDOWN:
# 删除最后添加的圆形
print("event: EVENT_RBUTTONDOWN")
try:
circles.pop()
except (IndexError):
print("no circles to delete")
if event == cv2.EVENT_MOUSEMOVE:
print("event: EVENT_MOUSEMOVE")
if event == cv2.EVENT_LBUTTONUP:
print("event: EVENT_LBUTTONUP")
if event == cv2.EVENT_LBUTTONDOWN:
print("event: EVENT_LBUTTONDOWN")