>

파이썬 opencv로 색상 감지 시스템을 만들려고 노력하고 있습니다. 이것은 내가 지금까지 한 일입니다. 아직 파이썬을 처음 접하므로 감사합니다.

기본적으로 사용자가이 응용 프로그램을 열면 카메라가 열리고 창의 아무 곳이나 클릭하면 색상 이름이 표시됩니다

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()

  • 답변 # 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  는 한 번만 실행되고 버전은 한 프레임에만 텍스트를 넣지 만 몇 밀리 초 후에 메인 루프가 새 프레임을 가져 와서 텍스트없이 표시하므로 프레임에 텍스트가 표시되지 않습니다.

  • 이전 파이썬에서 인터넷없이 음성 인식
  • 다음 python - 로컬로 연결된 레이어와 밀도가 높은 부모 레이어로 로컬로 연결된 레이어를 어떻게 만들 수 있습니까?