본문 바로가기
PYTHON(파이썬)/TKINTER & KIVY

tkinter & opencv

by eplus 2024. 10. 29.

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 구현하기  (1) 2024.10.29
GUI 툴 kivy란? (크로스 플랫폼)  (9) 2024.10.29
tkinter를 APP로 전환은?  (1) 2024.10.29
tkinter & socket  (0) 2024.10.29
tkinter (GUI)  (0) 2024.10.29