관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

비전 에이전트 6 - [비전 에이전트 4] 특수 효과 2 : 비디오 특수 효과 본문

인공지능/컴퓨터 비전

비전 에이전트 6 - [비전 에이전트 4] 특수 효과 2 : 비디오 특수 효과

huenuri 2024. 11. 12. 07:24

이번에는 비디오 특수 효과에 대해서 공부해보겠다.


 

 

 

비디오 특수 효과

프로그램 6-6을 조금 수정하면 비디오 버전으로 만들 수 있다. 비디오 버전에서 신경 쓸 점은 웹 캠을 통해 들어오는 초당 30프레임의 영상을 실시간으로 처리하는 일이다. 한 장을 특수 효과 처리하는 시간이 1/30초 이내라면 지연 없이 비디오를 디스플레이할 수 있다. 그렇지 않다면 지연이 발생한다.

프로그램 6-7의 실행 결과를 보고 사용자 인터페이스를 확인해보자. <비디오 시작> 버튼은 웹 캠과 연결하여 윈도우에 비디오 영상을 디스플레이한다. 두 번째 메뉴는 콤보박스로 여러 특수 효과 중에서 하나를 선태할 수 있다. 

 

비디오 영상에 특수 효과 처리하기

 

이 코드는 PyQt5와 OpenCV를 사용하여 실시간 비디오에 여러 특수 효과를 적용하고 화면에 표시하는 애플리케이션이다. GUI 버튼을 사용해 비디오 스트림을 시작하고, 콤보박스에서 효과를 선택하여 엠보싱, 카툰, 연필 스케치, 유화 효과 등을 실시간으로 적용할 수 있다.

 

1. 필요한 라이브러리 임포트

import cv2 as cv
import numpy as np
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication, QComboBox
import sys
  • cv2: OpenCV 라이브러리로 비디오 캡처 및 이미지 처리 작업에 사용
  • numpy: 필터 및 배열 연산을 위한 라이브러리
  • PyQt5.QtWidgets: PyQt의 GUI 구성 요소 (QMainWindow, QPushButton, QComboBox)를 가져옴
  • sys: 프로그램 종료 시 사용

 

2. VideoSpecialEffect 클래스 정의

class VideoSpecialEffect(QMainWindow):
  • 이 클래스는 QMainWindow를 상속받아 GUI 창을 생성하고, 비디오 특수 효과를 관리하는 역할을 함

 

3. 초기화 메서드 (__init__)

def __init__(self):
  • 프로그램의 GUI 요소(버튼, 콤보박스)를 설정하고 위치를 지정
  • videoButton: 비디오를 시작
  • pickCombo: 특수 효과를 선택하는 콤보박스
  • quitButton: 프로그램을 종료하는 버튼
  • 각 버튼에 해당하는 기능(비디오 시작, 종료)을 연결

 

4. 비디오 특수 효과 함수 (videoSpecialEffectFunction)

def videoSpecialEffectFunction(self):
  • 비디오 스트림을 실행하고 선택된 특수 효과를 프레임에 적용하여 실시간으로 화면에 표시하는 함수
  • cv.VideoCapture(0, cv.CAP_DSHOW): 기본 카메라(0번 장치)로 비디오 캡처를 시작
  • while True 루프를 통해 카메라에서 지속적으로 프레임을 읽어옴

 

5. 특수 효과 적용

  • pick_effect = self.pickCombo.currentIndex()를 통해 콤보박스에서 현재 선택된 효과를 가져옴
  • 선택된 효과에 따라 조건문을 통해 각 효과를 프레임에 적용
  • 엠보싱 효과 (pick_effect == 0)
    • 그레이스케일 변환 후, 엠보싱 필터를 적용하여 엠보싱 효과를 나타냄
  • 카툰 효과 (pick_effect == 1)
    • cv.stylization을 통해 카툰 스타일로 변환. sigma_s와 sigma_r 파라미터를 조절하여 효과를 강화하거나 줄일 수 있음
  • 연필 스케치 (명암, pick_effect == 2)
    • cv.pencilSketch 함수를 사용해 명암 기반의 연필 스케치 효과를 적용
  • 연필 스케치 (컬러, pick_effect == 3)
    • 같은 cv.pencilSketch 함수로 컬러 연필 스케치 효과를 적용
  • 유화 효과 (pick_effect == 4)
    • cv.xphoto.oilPainting을 사용해 유화 효과를 적용
  • 모든 효과는 special_img 변수에 저장되며, cv.imshow를 통해 화면에 실시간으로 표시됨

 

6. 종료 함수 (quitFunction)

def quitFunction(self):
  • self.cap.release()로 카메라 연결을 해제하고, cv.destroyAllWindows()로 OpenCV 창을 모두 닫은 뒤, self.close()로 프로그램을 종료

 

7. PyQt 애플리케이션 실행

app = QApplication(sys.argv) win = VideoSpecialEffect() win.show() app.exec_()
  • QApplication 객체를 생성하여 GUI 애플리케이션을 실행하고, VideoSpecialEffect 클래스 인스턴스를 생성해 창을 표시
  • app.exec_()로 이벤트 루프가 시작되어 GUI가 동작하게 됨

 

 

 

코드 실행해보기

 

비디오 시작을 누르고 메뉴를 선택하며 카메라에서 특수 효과가 바로 적용되어 나온다.


 

 

 

1. 엠보싱

 

 

 

 

 

2. 카툰

 

 

 

3. 연필 스케치(명암)

 

 

 

 

 

4. 연필 스케치(컬러)

 

 

 

 

5. 유화

 

이렇게 멋진 작품이 완성되었다.


 

 

 

학습을 마치고

오늘은 새벽 2시부터 7시 20분까지 5시간 넘게 공부를 진행했다. 어제도 그 정도 이상 했었다. 일찍 취침하고 일찍 일어나니 정말 좋았다. 난 보통 9시도 안 되서 잠이 오는데 대신 새벽형 인간이라 새벽에 일찍 일어난다. 2시는 기본이고 어제는 1시 반에 일어나서 공부하니 얼마나 기쁘고 행복했는지 모른다.

어제는 잠이 많이 와서 음악을 틀어놓고 했지만 오늘은 그럴 필요도 없이 침묵 속에서 공부를 진행했다.

 

이제 아침 루틴을 수행하고 운동 갈 준비를 해야겠다. 운동은 어제보다 조금 늦게 시작할 것 같다.