繁体   English   中英

Python:显示图像直到单击鼠标按钮

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM