-
tkinter & opencvPYTHON(파이썬)/TKINTER & KIVY 2024. 10. 29. 05:29728x90반응형
webcam 또는 CCTV 화면 표시
import tkinter as tk # Tkinterfrom PIL import ImageTk, Image # Pillowimport cv2 as cv # OpenCVimport osimport 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은 Trueif not ret:cap.release() # 작업 완료 후 해제returnframe = 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 = imgtklbl1.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 : 시스템 모듈 관련으로, 실행 시 신뢰도를 받기 위해 사용합니다.
주요 구성 및 흐름
- 인터페이스 처리
- 실행 시 신뢰도( slabel, scctv)를 사용자가 입력한 값으로 프로그램에 접근할 수 있도록 하세요. 만약 그렇지 않다면 그것은 ""설정되어야 합니다.
- slabel은 GUI 창의 제목이고, scctv영상 소스(CCTV)를 지정합니다.
-
파이썬코드모사try: slabel = sys.argv[1] scctv = sys.argv[2] except: slabel = "" scctv = ""
- Tkinter 윈도우 설정
- Tkinter를 설정하고 크기를 설정합니다.
- geometry아웃룩의 크기와 위치를 확인하여 크기 조정이 가능합니다.
-
파이썬코드모사win = tk.Tk() # 인스턴스 생성 win.title("CCTV") # 제목 표시줄 추가 win.geometry("800x600+50+50") # 지오메트리: 너비x높이+x좌표+y좌표 win.resizable(False, False) # x축, y축 크기 조정 비활성화
- 라벨설정
- 기본 라벨을 설정하여 프로그램 상단에 slabel텍스트를 표시합니다.
-
파이썬코드모사if slabel == "": slabel = "My WebCAM(CCTV)" lbl = tk.Label(win, text=slabel) lbl.grid(row=0, column=0)
- 프레임 및 영상 출력 라벨 설정
- frm프레임을 추가하여 프레임을 보호하고, 이 프레임을 내부에 lbl1추가하여 영상을 표시합니다.
-
파이썬코드모사frm = tk.Frame(win, bg="white", width=780, height=560) # 프레임 너비, 높이 설정 frm.grid(row=1, column=0) # 격자 행, 열 배치 lbl1 = tk.Label(frm) lbl1.grid()
- 비디오 캡처 설정
- 비디오 소스를 설정합니다. 만약 scctv있다면 누구든지 싫어하는 사람은 기본적으로 사랑받게 될 것입니다 0.
- cap = cv.VideoCapture(scctv)영상 캡처를 위해 VideoCapture생성합니다.
-
파이썬코드모사if scctv == "": scctv = "0" cap = cv.VideoCapture(scctv) # VideoCapture 객체 정의
- 애니메이션 함수 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다시 호출하여 계속해서 영상을 기다리겠습니다.
-
파이썬코드모사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 함수 호출
- GUI 작업
- win.mainloop()로 GUI 루프를 시작하여 이벤트 처리를 계속합니다. 이 루프가 종료될 때까지 프로그램이 실행됩니다.
-
파이썬코드모사win.mainloop() # GUI 시작
요약
- 프로그램은 사용자의 감시 또는 CCTV 영상을 통해 Tkinter GUI에서 보여줍니다.
- slabel영상은 혈관으로 변환 되며, 사용자는 scctv창 제목과 영상 소스에 접근할 수 있습니다.
- 프로그램은 10ms마다 기다려지면서 스트리밍을 구현합니다.
개선 사항
- 예외 처리 추가 : 카메라가 잘못된 경우 예외 처리를 추가하여 프로그램을 종료하는 것을 방지합니다.
- 종료 처리 : 프로그램 종료 시 cap.release()및 관련하여 안전하게 대피하는 기능을 추가하는 것이 좋습니다.
- 프레임 저장의 예외 사용 : 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