python - 在 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_min
、g_min
、r_min
、b_max
、的最小值和最大值 R、G、B 像素。为此,我正在使用“cv2.setMouseCallback get_pixel”,它应该在移动鼠标的 x、y 点保持 RGB 像素的最小/最大值。g_max
r_max
and the callback function
现在有一个与回调函数之外的变量可访问性相关的错误:
UnboundLocalError: local variable 'b_min' referenced before assignment
.
我如何访问和修改这些变量?
解决方案
我将 bgr minmax 变量放在函数之外,并使用关键字在track_ground
andget_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())
推荐阅读
- linux - 可执行 ELF 中的 PT_INTERP 段顺序
- c - 在计算浮点数组的大小时,它在 C 中打印大小为 2 而不是 41
- python-3.x - 插槽右键单击菜单操作不起作用
- java - 可以在 Netty 中压缩请求吗?
- json - Gatling - 在静态 JSON 内容中连接 JSON 文件
- c - 在c中使用scanf恢复字符
- linux - l3fwd 中的数据包捕获
- angular - 算子函数
缺少“可观察”类型的以下属性:_isScalar、源、运算符、 - bash - 执行位于子文件夹中的 python 代码
- java - 具有在另一个类中计算的 xy 数据的简单 Java Plot