numpy cv2的参数应该是什么,setMouseCallback()

j2qf4p5b  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(239)

我一直在开发opencv,并通过了cv 2。setMouseCallback()。下面是在鼠标单击时绘制圆的代码。
import cv2 import numpy as np

import cv2
import numpy as 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()`

请解释
1.函数draw_circle如何在不传递所有参数的情况下被调用
1.函数中有五个参数,只有两个变量可以赋值
1.创建cv 2的目的是什么?namedWindow(“image”)
谢谢!

xqk2d5yq

xqk2d5yq1#

1.您不调用draw_circle,openCV会在鼠标事件中使用适当的事件和坐标为您调用它,您只需指定在setMouseCallback中调用哪个函数
1.如果你需要额外的变量,你可以通过param发送
1.您可以有多个窗口,每个窗口都有不同的鼠标操作集
我希望这个例子可以帮助那些偶然发现的人:

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()

相关问题