【问题标题】:color detection system with python opencv带有python opencv的颜色检测系统
【发布时间】:2019-09-19 17:28:24
【问题描述】:

我正在尝试使用 python opencv 制作颜色检测系统,这是我迄今为止所做的。我还是python的新手,所以请帮助我,谢谢

基本上应该发生的是,当用户打开此应用程序时,相机会打开,当他单击窗口上的任何位置时,它会告诉颜色的名称

from tkinter import *
from tkinter import ttk
import cv2
import numpy as np
import webcolors

def click_event(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        blue = cap[y, x, 0]
        green = cap[y, x, 1]
        red = cap[y, x, 2]
        font = cv2.FONT_HERSHEY_SIMPLEX

        #colourcode = str(blue) + ", " + str(green) + ", " + str(red)
        colourcode2 = (red, green, blue)

        cv2.imshow('frame', frame)

        def closest_colour(requested_colour):
            min_colours = {}
            for key, name in webcolors.css3_hex_to_names.items():
                r_c, g_c, b_c = webcolors.hex_to_rgb(key)
                rd = (r_c - requested_colour[0]) ** 2
                gd = (g_c - requested_colour[1]) ** 2
                bd = (b_c - requested_colour[2]) ** 2
                min_colours[(rd + gd + bd)] = name
            return min_colours[min(min_colours.keys())]

        def get_colour_name(requested_colour):
            try:
                closest_name = actual_name = webcolors.rgb_to_name(requested_colour)
            except ValueError:
                closest_name = closest_colour(requested_colour)
                actual_name = None
            return actual_name, closest_name


        #print(colourcode2)
        requested_colour = colourcode2
        actual_name, closest_name = get_colour_name(requested_colour)

        #print("colour name:", closest_name)
        cv2.putText(img, closest_name, (0, 50), font, 1, 255, 2)

cap = cv2.VideoCapture(0);
while True:
    ret, frame = cap.read()

    cv2.imshow('frame', frame)

    if cv2.waitKey(40) == 27:
        break



cv2.waitKey(0)
cv2.destroyAllWindows()

【问题讨论】:

  • 有什么问题?始终将完整的错误消息(从“Traceback”一词开始)作为文本(不是屏幕截图)提出问题(不是评论)。还有其他有用的信息。

标签: python opencv colors detection


【解决方案1】:

我不知道您的问题是什么,但我使用您的代码创建了适合我的版本

我使用cv2.setMouseCallback 将您的功能分配给鼠标单击。它从frame 获取像素,而不是cap。像素是 (B,G,R) 的列表/元组,所以我很尊敬它list[::-1]。获得颜色名称后,我将其分配给外部/全局变量,而不是放在框架上。在主循环中,我使用这个名称在框架显示之前放置它。

我还使用EVENT_LBUTTONUP 在释放鼠标按钮时删除文本。

 elif event == cv2.EVENT_LBUTTONUP:
      closest_name = ''

如果你删除上面的行,那么当你释放鼠标按钮时它会保留文本。

import cv2
import webcolors

# --- functions ---

def closest_colour(requested_colour):
    min_colours = {}
    for key, name in webcolors.css3_hex_to_names.items():
        r_c, g_c, b_c = webcolors.hex_to_rgb(key)
        rd = (r_c - requested_colour[0]) ** 2
        gd = (g_c - requested_colour[1]) ** 2
        bd = (b_c - requested_colour[2]) ** 2
        min_colours[(rd + gd + bd)] = name
    return min_colours[min(min_colours.keys())]

def get_colour_name(requested_colour):
    try:
        closest_name = actual_name = webcolors.rgb_to_name(requested_colour)
    except ValueError:
        closest_name = closest_colour(requested_colour)
        actual_name = None
    return actual_name, closest_name

def click_event(event, x, y, flags, param):
    global closest_name # inform function to assign to global/external variable instead of creating local one

    if event == cv2.EVENT_LBUTTONDOWN:
        #B, G, R = frame[x, y]
        #colour = (R, G, B)  # reverse values
        colour = frame[y,x][::-1] # reverse values
        actual_name, closest_name = get_colour_name(colour)
        print(actual_name, closest_name)

    elif event == cv2.EVENT_LBUTTONUP:
        closest_name = ''

# --- main ---

font = cv2.FONT_HERSHEY_SIMPLEX

closest_name = '' # create global variable at start

cap = cv2.VideoCapture(0);

cv2.namedWindow('frame')
cv2.setMouseCallback('frame', click_event)

while True:
    ret, frame = cap.read()

    if closest_name:
        #print(closest_name)
        cv2.putText(frame, closest_name, (10, 30), font, 1, (255,255,255), 2)

    cv2.imshow('frame', frame)

    if cv2.waitKey(40) == 27:
        break

cv2.waitKey(0)
cv2.destroyAllWindows()

cap.release()

在所有 GUI 中,当您按下按钮时,它会创建单个事件 EVENT_LBUTTONDOWN - 当您按住按钮时,它不会一次又一次地生成它。所以函数 click_event 只执行一次,你的版本只将文本放在一个帧上,但几毫秒后主循环获取新帧并在没有文本的情况下显示它 - 所以最后你看不到帧上的文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2023-03-13
    • 1970-01-01
    • 2021-08-20
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多