首页 > 解决方案 > 在 opencv 回调函数之外访问变量

问题描述

我正在使用 OpenCV 根据其 RGB 值跟踪图像的一部分并使用cv2.setMouseCallback

这是我的代码:

def track_ground():
    b_min, g_min, r_min = 255, 255, 255
    b_max, g_max, r_max = 0, 0, 0
    
    ##########################################
    # mouse callback function
    def get_pixel(event,x,y,flags,param):

        if event == cv2.EVENT_MOUSEMOVE:
            b, g, r = img[x, y]
            # We are moving around the mouse to find the range of values for rgb
            # of the background; we will use them for thresholding later.

            b_min = min(b, b_min)
            g_min = min(g, g_min)
            r_min = min(r, r_min)
            b_max = max(b, b_max)
            g_max = max(g, g_max)
            r_max = max(r, r_max)

    
    img = cv2.imread('data/my_image.jpg')
    cv2.namedWindow('image')
    cv2.setMouseCallback('image',get_pixel)
    while True:
        cv2.imshow('image',img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cv2.destroyAllWindows()
    
    ###########################################
    
    print('min:', b_min, g_min, r_min)
    print('max:', b_max, g_max, r_max)
    
    return (b_min, g_min, r_min), (b_max, g_max, r_max)

这个想法是,当我在图像的特定部分移动鼠标时,我想获得变量b_ming_minr_minb_max、的最小值和最大值 R、G、B 像素。为此,我正在使用“cv2.setMouseCallback get_pixel”,它应该在移动鼠标的 x、y 点保持 RGB 像素的最小/最大值。g_maxr_maxand the callback function

现在有一个与回调函数之外的变量可访问性相关的错误: UnboundLocalError: local variable 'b_min' referenced before assignment.

我如何访问和修改这些变量?

标签: pythonopencvvariablescallbackscope

解决方案


我将 bgr minmax 变量放在函数之外,并使用关键字在track_groundandget_pixel函数的范围内使用它们。global我还将您的显示代码更改为仅显示一次图像,在窗口打开时打印最小最大值,并在窗口上按下“X”时结束 while 循环。

代码:

import cv2

def track_ground():
    b_min, g_min, r_min = 255, 255, 255
    b_max, g_max, r_max = 0, 0, 0
    
    ##########################################
    # mouse callback function
    def get_pixel(event,x,y,flags,param):
        nonlocal b_min, g_min, r_min, b_max, g_max, r_max

        if event == cv2.EVENT_MOUSEMOVE:
            b, g, r = img[x, y]
            # We are moving around the mouse to find the range of values for rgb
            # of the background; we will use them for thresholding later.

            b_min = min(b, b_min)
            g_min = min(g, g_min)
            r_min = min(r, r_min)
            b_max = max(b, b_max)
            g_max = max(g, g_max)
            r_max = max(r, r_max)

    
    img = cv2.imread('test.jpg')
    cv2.namedWindow('image')
    cv2.setMouseCallback('image',get_pixel)
    cv2.imshow('image',img)
    while cv2.getWindowProperty('image', 1) >= 0:
        print(b_min, g_min, r_min)
        print(b_max, g_max, r_max)
        k = cv2.waitKey(30)
    cv2.destroyAllWindows()
    
    
    ###########################################
    return (b_min, g_min, r_min), (b_max, g_max, r_max)

print(track_ground())
    

我在这张图片上测试了它,它似乎工作:在此处输入图像描述


推荐阅读