[英]Python: show image until mouse button is clicked
我正在使用 Python 3.8 编写代码,其中要求用户在图像出现时立即按下按钮。 然后图像被替换为白色屏幕,随机间隔 1 到 4 秒,直到出现新图像。 我使用 cv2.waitKey() 直到按下空格键:没问题,工作正常。 见下文:
import sys, cv2, random
im = cv2.imread('image.tiff')
imBlank = cv2.imread('imageBlank.tiff')
cv2.namedWindow('win', cv2.WINDOW_NORMAL)
for i in range(5): # create a loop that runs 5 times
cv2.imshow('win', im) # show the image
k = cv2.waitKey(0) # wait until key press
if k == 32: # when space bar is pressed
cv2.imshow('win', imBlank) # show a blank screen
SI = random.randint(1,4) # random interval between 1 and 4 seconds
cv2.waitKey(SI*1000) # wait for random interval until loop starts again
现在的问题是我想完全这样做,但不是空格键,我希望用户按下鼠标按钮。 据我所知, cv2.waitKey() 函数对鼠标不起作用,所以我写了下面的代码:
def showBlank(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
cv2.imshow('win', imBlank)
elif event == cv2.EVENT_RBUTTONDOWN:
cv2.imshow('win', imBlank)
# repeat the loop 5 times
for i in range(5):
cv2.imshow('win', im) # show the image
cv2.setMouseCallback('win', showBlank) # go to function showBlank()
""" wait here until mouse button is clicked"""
SI = random.randint(1,4) # random interval between 1 and 4 seconds
cv2.waitKey(SI*1000) # wait for random interval until loop starts again
同样,这段代码基本上有效,但如果用户没有按下鼠标按钮,循环仍然会继续运行。 我希望循环等待随机间隔开始,直到单击鼠标。
谢谢! 我希望有人能在这里帮助我
我开发了这个使用 Python 3.8.0 在我的计算机上运行的解决方案。
import sys, cv2, random
def swapImages():
cv2.imshow('win', imBlank)
SI = random.randint(1,4)
cv2.waitKey(SI*1000)
cv2.imshow('win', im)
def showBlank(event, x, y, flags, param):
#param is the array i from below
if event == cv2.EVENT_LBUTTONDOWN:
print("showBlank: i[0]: ", param)
swapImages()
param[0] = param[0] + 1
elif event == cv2.EVENT_RBUTTONDOWN:
print("showBlank: i[0]: ", param)
swapImages()
param[0] = param[0] + 1
im = cv2.imread('image.tiff')
imBlank = cv2.imread('imageBlank.tiff')
cv2.namedWindow('win', cv2.WINDOW_NORMAL)
i = [0]
# the mousecallback only needs to be set once
cv2.setMouseCallback('win', showBlank, i )
# show the initial image for the first time.
cv2.imshow('win', im)
while i[0] < 5:
cv2.waitKey(10)
根据这是不posssible等待鼠标单击以同样的方式,一个可以等待键盘输入。 因此,我需要稍微修改原始代码。 上面代码的作用是运行一个while循环,直到变量i[0]达到值5。每次点击图像时i[0]都会增加。
对代码的一些解释:
数组
我 = [0]
通过“param”参数传递给鼠标回调。
cv2.setMouseCallback('win', showBlank, i )
如描述本中,“i”需要是一个容器,因为
Python 传递对对象的引用。 在您的函数中,您有一个对象——您可以随意修改该对象(如果可能)。 但是,整数是不可变的。 一种解决方法是在可以变异的容器中传递整数
i[0] 在每个鼠标事件发生变化
参数[0] = 参数[0] + 1
当 i[0] 达到 5 时,while 循环结束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.