ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • tkinter & opencv
    PYTHON(파이썬)/TKINTER & KIVY 2024. 10. 29. 05:29
    728x90
    반응형

    webcam 또는 CCTV 화면 표시 

    import tkinter as tk # Tkinter
    from PIL import ImageTk, Image # Pillow
    import cv2 as cv  # OpenCV
    import os
    import sys

    import time

    try:
        slabel = sys.argv[1]
        scctv = sys.argv[2]
    except:
        slabel = ""
        scctv = ""

    win = tk.Tk() # 인스턴스 생성
    win.title("CCTV") # 제목 표시줄 추가
    win.geometry("800x600+50+50") # 지오메트리: 너비x높이+x좌표+y좌표
    win.resizable(False, False) # x축, y축 크기 조정 비활성화
    # 라벨 추가
    if slabel == "":
        slabel = "My WebCAM(CCTV)"
    lbl = tk.Label(win, text=slabel)
    lbl.grid(row=0, column=0) # 라벨 행, 열 배치

    # 프레임 추가
    frm = tk.Frame(win, bg="white", width=780, height=560) # 프레임 너비, 높이 설정
    frm.grid(row=1, column=0) # 격자 행, 열 배치

    # 라벨1 추가
    lbl1 = tk.Label(frm)
    lbl1.grid()

    if scctv == "":
        scctv = "0"
       
    cap = cv.VideoCapture(scctv) # VideoCapture 객체 정의
    def video_play():
        ret, frame = cap.read() # 프레임이 올바르게 읽히면 ret은 True
        if not ret:
            cap.release() # 작업 완료 후 해제
            return
        frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        resize_img = cv.resize(frame, (780, 560))
        #
        cv.imwrite("cctv.jpg", frame)
        #
        img = Image.fromarray(resize_img) # Image 객체로 변환
        imgtk = ImageTk.PhotoImage(image=img) # ImageTk 객체로 변환
        # OpenCV 동영상
        lbl1.imgtk = imgtk
        lbl1.configure(image=imgtk)
        lbl1.after(10, video_play)
        #
       
    video_play()

    win.mainloop() #GUI 시작


    ChatGPT가 분석한 내용

    코드를 분석해 보았습니다. 이 코드는 Tkinter익숙한 GUI 인터페이스로 CCTV 영상을 보여주는 Python 프로그램입니다. Pillow는 이미지를 처리하기 위해 작업자를 검사하는 데 사용되며, OpenCV영상을 캡처하고 처리하는 데 사용됩니다. 이 코드를 통해 더 많은 분석을 해보겠습니다.

    주요 라이브러리 및 모듈

    • Tkinter ( tk) : GUI 창을 만드는 라이브러리.
    • Pillow ( ImageTk, Image) : 이미지를 Tkinter GUI에 표시하기 위해 사용합니다.
    • OpenCV( cv) : 영상 입력 및 처리 기능을 제공합니다.
    • os,sys : 시스템 모듈 관련으로, 실행 시 신뢰도를 받기 위해 사용합니다.

    주요 구성 및 흐름

    1. 인터페이스 처리
      • 실행 시 신뢰도( slabel, scctv)를 사용자가 입력한 값으로 프로그램에 접근할 수 있도록 하세요. 만약 그렇지 않다면 그것은 ""설정되어야 합니다.
      • slabel은 GUI 창의 제목이고, scctv영상 소스(CCTV)를 지정합니다.
    2. 파이썬
      코드모사
      try: slabel = sys.argv[1] scctv = sys.argv[2] except: slabel = "" scctv = ""
    3. Tkinter 윈도우 설정
      • Tkinter를 설정하고 크기를 설정합니다.
      • geometry아웃룩의 크기와 위치를 확인하여 크기 조정이 가능합니다.
    4. 파이썬
      코드모사
      win = tk.Tk() # 인스턴스 생성 win.title("CCTV") # 제목 표시줄 추가 win.geometry("800x600+50+50") # 지오메트리: 너비x높이+x좌표+y좌표 win.resizable(False, False) # x축, y축 크기 조정 비활성화
    5. 라벨설정
      • 기본 라벨을 설정하여 프로그램 상단에 slabel텍스트를 표시합니다.
    6. 파이썬
      코드모사
      if slabel == "": slabel = "My WebCAM(CCTV)" lbl = tk.Label(win, text=slabel) lbl.grid(row=0, column=0)
    7. 프레임 및 영상 출력 라벨 설정
      • frm프레임을 추가하여 프레임을 보호하고, 이 프레임을 내부에 lbl1추가하여 영상을 표시합니다.
    8. 파이썬
      코드모사
      frm = tk.Frame(win, bg="white", width=780, height=560) # 프레임 너비, 높이 설정 frm.grid(row=1, column=0) # 격자 행, 열 배치 lbl1 = tk.Label(frm) lbl1.grid()
    9. 비디오 캡처 설정
      • 비디오 소스를 설정합니다. 만약 scctv있다면 누구든지 싫어하는 사람은 기본적으로 사랑받게 될 것입니다 0.
      • cap = cv.VideoCapture(scctv)영상 캡처를 위해 VideoCapture생성합니다.
    10. 파이썬
      코드모사
      if scctv == "": scctv = "0" cap = cv.VideoCapture(scctv) # VideoCapture 객체 정의
    11. 애니메이션 함수 video_play정의 및 실행
      • 프레임 읽기 : ret, frame = cap.read()에서, ret이 True뒤에 프레임을 성공으로 쓴 것입니다. 실패하고, 포기 cap.release()하고 종료합니다.
      • 그레이일 변환 : frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)로 프레임을 그림자로 변환합니다.
      • 비디오 크기 : cv.resize(frame, (780, 560))로 프레임을 GUI 프레임 크기로 조정합니다.
      • 프레임 저장 : cv.imwrite("cctv.jpg", frame)프레임을 파일로 저장합니다. 이 부분은 프레임을 기록할 목적으로 사용할 수 있습니다.
      • 이미지 처리 및 GUI 업데이트 :
        • Image.fromarray(resize_img)로 NumPy 배열 형태를 베개 Image로 변환합니다.
        • ImageTk.PhotoImage(image=img)로이 Tkinter에서 사용되는 이미지를 변환합니다.
        • lbl1.configure(image=imgtk)로 라벨에 이미지를 설정하여 화면에 표시합니다.
        • lbl1.after(10, video_play)10ms 후에는 video_play다시 호출하여 계속해서 영상을 기다리겠습니다.
    12. 파이썬
      코드모사
      def video_play(): ret, frame = cap.read() # 프레임이 올바르게 읽히면 ret은 True if not ret: cap.release() # 작업 완료 후 해제 return frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 그레이스케일 변환 resize_img = cv.resize(frame, (780, 560)) # 크기 조정 cv.imwrite("cctv.jpg", frame) # 현재 프레임을 이미지 파일로 저장 img = Image.fromarray(resize_img) # Image 객체로 변환 imgtk = ImageTk.PhotoImage(image=img) # ImageTk 객체로 변환 lbl1.imgtk = imgtk lbl1.configure(image=imgtk) lbl1.after(10, video_play) # 10밀리초 후에 다시 video_play 함수 호출
    13. GUI 작업
      • win.mainloop()로 GUI 루프를 시작하여 이벤트 처리를 계속합니다. 이 루프가 종료될 때까지 프로그램이 실행됩니다.
    14. 파이썬
      코드모사
      win.mainloop() # GUI 시작

    요약

    • 프로그램은 사용자의 감시 또는 CCTV 영상을 통해 Tkinter GUI에서 보여줍니다.
    • slabel영상은 혈관으로 변환 되며, 사용자는 scctv창 제목과 영상 소스에 접근할 수 있습니다.
    • 프로그램은 10ms마다 기다려지면서 스트리밍을 구현합니다.

    개선 사항

    1. 예외 처리 추가 : 카메라가 잘못된 경우 예외 처리를 추가하여 프로그램을 종료하는 것을 방지합니다.
    2. 종료 처리 : 프로그램 종료 시 cap.release()및 관련하여 안전하게 대피하는 기능을 추가하는 것이 좋습니다.
    3. 프레임 저장의 예외 사용 : cv.imwrite()로 프레임을 계속 저장하는 부분은 디스크를 빠르게 캐울 수 있는 특수한, 따라서 필요에 따라 저장 여부를 결정할 수 있는 옵션을 추가하는 것이 었습니다.
    728x90

    'PYTHON(파이썬) > TKINTER & KIVY' 카테고리의 다른 글

    kivy로 윈도우용 GUI 구현하기  (0) 2024.10.29
    GUI 툴 kivy란? (크로스 플랫폼)  (8) 2024.10.29
    tkinter를 APP로 전환은?  (1) 2024.10.29
    tkinter & socket  (0) 2024.10.29
    tkinter (GUI)  (0) 2024.10.29
Designed by Tistory.