我的目标是使用单独的滑块编辑这6个值,因为我正在查看结果,因此我可以快速优化我的脚本检测到的内容。
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255]))
〜更新了脚本〜新问题“当我从网络摄像头捕获帧时,如何让滑块与值进行交互?”
import cv2
import numpy as np
from Tkinter import *
master = Tk()
w1 = Scale(master, from_=110, to=255, orient=HORIZONTAL)
w1.pack()
w2 = Scale(master, from_=50, to=255, orient=HORIZONTAL)
w2.pack()
w3 = Scale(master, from_=50, to=255, orient=HORIZONTAL)
w3.pack()
w4 = Scale(master, from_=130, to=255, orient=HORIZONTAL)
w4.pack()
w5 = Scale(master, from_=255, to=255, orient=HORIZONTAL)
w5.pack()
w6 = Scale(master, from_=255, to=255, orient=HORIZONTAL)
w6.pack()
w1 = w1.get()
w2 = w2.get()
w3 = w3.get()
w4 = w4.get()
w5 = w5.get()
w6 = w6.get()
cap = cv2.VideoCapture(0)
while(1):
_, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_blue = np.array([w1,w2,w3])
upper_blue = np.array([w4,w5,w6])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
res = cv2.bitwise_and(frame,frame, mask= mask)
cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
答案 0 :(得分:1)
所以你在这里遇到了一些问题。首先,您要覆盖这些行中的w1,w2,w3...
变量:
w1 = w1.get()
w2 = w2.get()
w3 = w3.get()
w4 = w4.get()
w5 = w5.get()
w6 = w6.get()
这是删除对Scale
小部件的引用,阻止您再次使用它们。
第二个问题是你遇到了真正应该使用多线程的情况。理想情况下,您拥有的while
循环将在一个线程中运行,并且为了保持响应,Scale
小部件也应该在一个线程中运行。
[补充工具栏:事实证明,在线程之间共享一个Scale
小部件可能会导致一些非常奇怪的行为,因此我可以使用来自{{1}的同步Array
来解决这个问题。 }模块是线程安全的]
我建议你去threading in Python阅读。但是,为了帮助您入门,下面的代码提供了一个示例,说明如何在一个线程中运行multiprocessing
小部件,而在另一个线程中循环。
Scale