우리팀 아이디어를 유료화하기 위한 제품화 1단계 - 실시간 영상속 사물검출하여 "??영상판독기" 만들기

Daum 카페

1단계: 웹캠 화면만 표시하기

주피터 노트북에서 실행

import cv2
import tkinter as tk
from PIL import Image, ImageTk

# 웹캠 프레임을 업데이트하는 함수
def update_frame():
    ret, frame = cap.read()
    if ret:
        # OpenCV 이미지를 PIL 이미지로 변환
        img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        img = Image.fromarray(img)
        imgtk = ImageTk.PhotoImage(image=img)
        
        # 레이블에 이미지 업데이트
        video_label.imgtk = imgtk
        video_label.configure(image=imgtk)
    video_label.after(10, update_frame)

# tkinter 윈도우 설정
root = tk.Tk()
root.title("웹캠 화면")

# 웹캠 캡처 설정
cap = cv2.VideoCapture(0)

# 비디오 레이블 설정
video_label = tk.Label(root)
video_label.pack()

# 프레임 업데이트 시작
update_frame()

# tkinter 윈도우 실행
root.mainloop()

# 프로그램 종료 시 웹캠 해제
cap.release()

2단계: 사진 찍기 버튼 추가

import cv2
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

def update_frame():
    ret, frame = cap.read()
    if ret:
        img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        img = Image.fromarray(img)
        imgtk = ImageTk.PhotoImage(image=img)
        video_label.imgtk = imgtk
        video_label.configure(image=imgtk)
    video_label.after(10, update_frame)

# 사진 찍기 함수
def capture_photo():
    ret, frame = cap.read()
    if ret:
        filepath = filedialog.asksaveasfilename(defaultextension=".jpg", filetypes=[("JPEG files", "*.jpg")])
        if filepath:
            cv2.imwrite(filepath, frame)
            print("사진 저장 완료:", filepath)

root = tk.Tk()
root.title("웹캠 화면")

cap = cv2.VideoCapture(0)

video_label = tk.Label(root)
video_label.pack()

# 사진 찍기 버튼 추가
capture_button = tk.Button(root, text="사진 찍기", command=capture_photo)
capture_button.pack(side=tk.LEFT, padx=10, pady=10)

update_frame()

root.mainloop()

cap.release()

3단계: 녹화 시작 버튼 추가

import cv2
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import threading
import time

recording = False

def update_frame():
    ret, frame = cap.read()
    if ret:
        img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        img = Image.fromarray(img)
        imgtk = ImageTk.PhotoImage(image=img)
        video_label.imgtk = imgtk
        video_label.configure(image=imgtk)
    video_label.after(10, update_frame)

def capture_photo():
    ret, frame = cap.read()
    if ret:
        filepath = filedialog.asksaveasfilename(defaultextension=".jpg", filetypes=[("JPEG files", "*.jpg")])
        if filepath:
            cv2.imwrite(filepath, frame)
            print("사진 저장 완료:", filepath)

# 동영상 녹화 시작 함수
def start_recording():
    global recording
    if not recording:
        recording = True
        filepath = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 files", "*.mp4")])
        if filepath:
            fourcc = cv2.VideoWriter_fourcc(*'mp4v')
            out = cv2.VideoWriter(filepath, fourcc, 20.0, (640, 480))
            
            def record():
                while recording:
                    ret, frame = cap.read()
                    if ret:
                        out.write(frame)
                        time.sleep(0.05)
                out.release()
                print("동영상 저장 완료:", filepath)

            threading.Thread(target=record).start()

root = tk.Tk()
root.title("웹캠 화면")

cap = cv2.VideoCapture(0)

video_label = tk.Label(root)
video_label.pack()

capture_button = tk.Button(root, text="사진 찍기", command=capture_photo)
capture_button.pack(side=tk.LEFT, padx=10, pady=10)

# 녹화 시작 버튼 추가
start_record_button = tk.Button(root, text="녹화 시작", command=start_recording)
start_record_button.pack(side=tk.LEFT, padx=10, pady=10)

update_frame()

root.mainloop()

cap.release()

4단계: 녹화 중지 버튼 추가

import cv2
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import threading
import time

recording = False

def update_frame():
    ret, frame = cap.read()
    if ret:
        img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        img = Image.fromarray(img)
        imgtk = ImageTk.PhotoImage(image=img)
        video_label.imgtk = imgtk
        video_label.configure(image=imgtk)
    video_label.after(10, update_frame)

def capture_photo():
    ret, frame = cap.read()
    if ret:
        filepath = filedialog.asksaveasfilename(defaultextension=".jpg", filetypes=[("JPEG files", "*.jpg")])
        if filepath:
            cv2.imwrite(filepath, frame)
            print("사진 저장 완료:", filepath)

def start_recording():
    global recording
    if not recording:
        recording = True
        filepath = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 files", "*.mp4")])
        if filepath:
            fourcc = cv2.VideoWriter_fourcc(*'mp4v')
            out = cv2.VideoWriter(filepath, fourcc, 20.0, (640, 480))
            
            def record():
                while recording:
                    ret, frame = cap.read()
                    if ret:
                        out.write(frame)
                        time.sleep(0.05)
                out.release()
                print("동영상 저장 완료:", filepath)

            threading.Thread(target=record).start()

# 녹화 중지 함수
def stop_recording():
    global recording
    if recording:
        recording = False
        print("녹화 중지")

root = tk.Tk()
root.title("웹캠 화면")

cap = cv2.VideoCapture(0)

video_label = tk.Label(root)
video_label.pack()

capture_button = tk.Button(root, text="사진 찍기", command=capture_photo)
capture_button.pack(side=tk.LEFT, padx=10, pady=10)

start_record_button = tk.Button(root, text="녹화 시작", command=start_recording)
start_record_button.pack(side=tk.LEFT, padx=10, pady=10)

# 녹화 중지 버튼 추가
stop_record_button = tk.Button(root, text="녹화 중지", command=stop_recording)
stop_record_button.pack(side=tk.RIGHT, padx=10, pady=10)

update_frame()

root.mainloop()

cap.release()import cv2
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import threading
import time

recording = False

def update_frame():
    ret, frame = cap.read()
    if ret:
        img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        img = Image.fromarray(img)
        imgtk = ImageTk.PhotoImage(image=img)
        video_label.imgtk = imgtk
        video_label.configure(image=imgtk)
    video_label.after(10, update_frame)

def capture_photo():
    ret, frame = cap.read()
    if ret:
        filepath = filedialog.asksaveasfilename(defaultextension=".jpg", filetypes=[("JPEG files", "*.jpg")])
        if filepath:
            cv2.imwrite(filepath, frame)
            print("사진 저장 완료:", filepath)

def start_recording():
    global recording
    if not recording:
        recording = True
        filepath = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 files", "*.mp4")])
        if filepath:
            fourcc = cv2.VideoWriter_fourcc(*'mp4v')
            out = cv2.VideoWriter(filepath, fourcc, 20.0, (640, 480))
            
            def record():
                while recording:
                    ret, frame = cap.read()
                    if ret:
                        out.write(frame)
                        time.sleep(0.05)
                out.release()
                print("동영상 저장 완료:", filepath)

            threading.Thread(target=record).start()

# 녹화 중지 함수
def stop_recording():
    global recording
    if recording:
        recording = False
        print("녹화 중지")

root = tk.Tk()
root.title("웹캠 화면")

cap = cv2.VideoCapture(0)

video_label = tk.Label(root)
video_label.pack()

capture_button = tk.Button(root, text="사진 찍기", command=capture_photo)
capture_button.pack(side=tk.LEFT, padx=10, pady=10)

start_record_button = tk.Button(root, text="녹화 시작", command=start_recording)
start_record_button.pack(side=tk.LEFT, padx=10, pady=10)

# 녹화 중지 버튼 추가
stop_record_button = tk.Button(root, text="녹화 중지", command=stop_recording)
stop_record_button.pack(side=tk.RIGHT, padx=10, pady=10)

update_frame()

root.mainloop()

cap.release()

5단계: 사물 검출용 화면 인터페이스 만들기

!pip install ultralytics
import cv2
import tkinter as tk
from PIL import Image, ImageTk
import threading
from ultralytics import YOLO

# YOLO 모델 로드
model = YOLO('yolov8n.pt')

# tkinter 윈도우 설정
root = tk.Tk()
root.title("YOLOv8 실시간 사람 검출")

# 웹캠 캡처 설정
cap = cv2.VideoCapture(0)

# 사물 검출 상태를 저장하는 변수
detecting = False

# 웹캠 프레임을 업데이트하고 사람 검출하는 함수
def update_frame():
    global detecting
    ret, frame = cap.read()
    if ret:
        if detecting:
            # YOLO 모델로 사람 검출
            results = model(frame)
            for result in results:
                boxes = result.boxes.cpu().numpy()
                for box in boxes:
                    # 검출된 객체가 사람일 경우에만 표시 (label이 'person'인 경우)
                    if int(box.cls[0]) == 0:  # 0은 'person' 클래스 번호
                        x1, y1, x2, y2 = map(int, box.xyxy[0])
                        label = result.names[int(box.cls[0])]  # 클래스 ID를 이름으로 변환
                        # 사람 텍스트와 사각형 박스를 그리기
                        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
                        cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

        # OpenCV 이미지를 PIL 이미지로 변환
        img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        img = Image.fromarray(img)
        imgtk = ImageTk.PhotoImage(image=img)
        
        # 레이블에 이미지 업데이트
        video_label.imgtk = imgtk
        video_label.configure(image=imgtk)
    video_label.after(10, update_frame)

# 사물 검출 시작 및 중지 함수
def toggle_detection():
    global detecting
    detecting = not detecting
    if detecting:
        detection_button.config(text="사물 검출 중지")
        print("사물 검출 시작")
    else:
        detection_button.config(text="사물 검출 시작")
        print("사물 검출 중지")

# 비디오 레이블 설정
video_label = tk.Label(root)
video_label.pack()

# 사물 검출 버튼 설정
detection_button = tk.Button(root, text="사물 검출 시작", command=toggle_detection)
detection_button.pack(padx=10, pady=10)

# 프레임 업데이트 시작
update_frame()

# tkinter 윈도우 실행
root.mainloop()

# 프로그램 종료 시 웹캠 해제
cap.release()

6단계. 나이 예측 하기

pip install deepface
pip install tf-keras