使用滑块编辑颜色值

时间:2014-06-01 18:24:17

标签: python python-2.7 opencv numpy tkinter

我的目标是使用单独的滑块编辑这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()

1 个答案:

答案 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