cv2.setMouseCallback() 的参数应该是啥
Posted
技术标签:
【中文标题】cv2.setMouseCallback() 的参数应该是啥【英文标题】:What should be the arguments of cv2.setMouseCallback()cv2.setMouseCallback() 的参数应该是什么 【发布时间】:2018-04-17 06:47:24 【问题描述】:我一直在研究 opencv 并通过了 cv2.setMouseCallback() 。以下是鼠标点击画圆的代码。 导入简历2 将 numpy 导入为 np
def draw_circle(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(image,(x,y),(100,100),(255,0,0),-1)
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow("image")
cv2.setMouseCallback("image",draw_circle)
while True:
cv2.imshow("image",image)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()`
请解释
-
如何在不传递所有参数的情况下调用函数 draw_circle
函数中有五个参数,只有两个变量
可以赋值
创建cv2.namedWindow("image")的目的是什么
谢谢!
【问题讨论】:
使用 setMouseCallback 后,每当鼠标移动或使用按钮时都会调用使用的函数。调用 setMouseCallback 时,您不会调用 draw_circle,而是告诉 setMouseCallback 应该在鼠标事件上调用哪个函数(这称为回调函数)。使用函数 namedWindow,您可以创建一个具有该名称和标题的新窗口。 【参考方案1】:你不调用draw_circle
,openCV 会在鼠标事件上用正确的事件和坐标为你调用它,你只需在setMouseCallback
中指定为哪个窗口调用哪个函数
如果您需要其他变量,可以通过param
发送它们
您可以拥有多个窗口,并为每个窗口设置不同的鼠标操作
我希望这个例子对偶然发现的人有所帮助:
import cv2
import numpy as np
from math import sqrt
def calc_distance(p1, p2):
(x1, y1) = p1
(x2, y2) = p2
return round(sqrt((x1-x2)**2 + (y1-y2)**2))
# param contains the center and the color of the circle
def draw_red_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
center = param[0]
radius = calc_distance((x, y), center)
cv2.circle(img, center, radius, param[1], 2)
def draw_blue_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
center = (100,100)
radius = calc_distance((x, y), center)
cv2.circle(img, center, radius, (255, 0, 0), 2)
img = np.zeros((512,512,3), np.uint8)
# create 2 windows
cv2.namedWindow("img_red")
cv2.namedWindow("img_blue")
# different doubleClick action for each window
# you can send center and color to draw_red_circle via param
param = [(200,200),(0,0,255)]
cv2.setMouseCallback("img_red", draw_red_circle, param)
cv2.setMouseCallback("img_blue", draw_blue_circle) # param = None
while True:
# both windows are displaying the same img
cv2.imshow("img_red", img)
cv2.imshow("img_blue", img)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
【讨论】:
好答案!谢谢!以上是关于cv2.setMouseCallback() 的参数应该是啥的主要内容,如果未能解决你的问题,请参考以下文章
初识OpenCV-Python - 003:Mouse as a paint-brush
番外4. Python OpenCV 中鼠标事件相关处理与常见问题解决方案