import os
import sys
import numpy as np
import cv2
from matplotlib import pyplot as plt
rawPath = os.path.abspath(__file__)
currentFile = os.path.basename(sys.argv[0])
dataPath = rawPath[:rawPath.find(currentFile)] + r'static\\'
def draw_circle(event, x, y, flags, param):
"""
在图片上双击过的位置绘制一个圆圈
:return:
"""
# 查看支持的鼠标事件
# events = [i for i in dir(cv2) if 'EVENT' in i]
# print(events)
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img, (x, y), 100, (255, 255, 255), -1)
img = np.zeros((500, 500, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while 1:
cv2.imshow('image', img)
if cv2.waitKey(20) == 27:
break
cv2.destroyAllWindows()
# 当鼠标按下时变为 True
drawing = False
# 如果 mode 为 true 绘制矩形,按下 m 变成绘制曲线
mode = True
ix, iy = -1, -1
# 创建回调函数
def draw_circle(event,x, y, flags, param):
global ix, iy, drawing, mode
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
if drawing == True:
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
# 绘制圆圈
cv2.circle(img, (x, y), 3, (0, 0, 255), -1)
# 下面注释掉的代码是起始点为圆心,起点到终点为半径的
# r = int(np.sqrt((x - ix)**2 + (y - iy)**2))
# cv2.circle(img, (x, y), r, (0, 0, 255), -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while 1:
cv2.imshow('image', img)
k = cv2.waitKey(1)
if k == ord('m'):
mode = not mode
elif k == 27:
break
来源:CSDN
作者:Jia ming
链接:https://blog.csdn.net/weixin_39541632/article/details/104106125