OpenCV 를 사용하여 비디오에서 Flappy Bird 감지하기

PythonBeginner
지금 연습하기

소개

이 프로젝트는 강력한 이미지 처리 및 컴퓨터 비전 라이브러리인 OpenCV 가 제공하는 cv2.matchTemplate 메서드를 사용하여 비디오에서 Flappy Bird 캐릭터를 감지하는 방법을 가르치도록 설계되었습니다. cv2.matchTemplate 함수는 템플릿 매칭 (template matching) 에 유용한 도구입니다. 템플릿 매칭은 디지털 이미지 처리에서 템플릿 이미지와 일치하는 이미지의 작은 부분을 찾는 기술입니다. 이 프로젝트에서는 이 방법을 비디오에서 Flappy Bird 캐릭터를 감지하는 데 적용하는 Python 프로젝트를 생성하여 Python 및 OpenCV 초급 및 중급 사용자를 위한 실용적인 예제를 만들 것입니다.

👀 미리보기

🎯 과제

이 프로젝트에서는 다음을 배우게 됩니다.

  • 이미지 처리를 위해 OpenCV 라이브러리를 가져와 사용하는 방법.
  • 비디오 및 이미지 데이터를 처리하는 함수를 작성하는 방법.
  • 비디오 프레임에서 객체 감지를 위해 템플릿 매칭을 구현하는 방법.
  • 비디오에서 결과를 주석 처리하고 표시하는 방법.

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다.

  • 기본적인 이미지 및 비디오 처리 작업에 OpenCV 를 사용합니다.
  • 비디오 데이터에서 객체를 감지하기 위해 템플릿 매칭 기술을 적용합니다.
  • 비디오에서 객체 감지 결과를 주석 처리하고 시각화합니다.

프로젝트 파일 생성

프로젝트 작업 공간을 준비하는 것으로 시작합니다. bird_detection.py라는 단일 Python 스크립트 파일을 생성합니다.

touch bird_detection.py

또한, 프로젝트 디렉토리에 비디오 파일 (예: flappybird.mp4) 과 새 이미지 파일 (예: bird.png) 이 있는지 확인합니다. 이 파일들은 비디오에서 새를 감지하는 데 사용됩니다.

프로젝트 디렉토리 구조

project/

├── bird_detection.py ## Python 스크립트
├── flappybird.mp4 ## 처리할 비디오 파일
└── bird.png ## 비디오에서 감지할 새 이미지

✨ 솔루션 확인 및 연습

OpenCV 임포트

bird_detection.py에서 OpenCV 라이브러리를 임포트하는 것으로 시작합니다. 이 라이브러리는 이미지 처리 및 컴퓨터 비전 기능을 제공합니다.

import cv2

cv2 를 임포트함으로써 모든 OpenCV 기능에 접근할 수 있습니다.

✨ 솔루션 확인 및 연습

새 감지 함수 정의

find_and_display_bird라는 함수를 정의합니다. 이 함수는 비디오 파일과 새 이미지의 경로를 인수로 받아 비디오의 각 프레임에서 새를 표시합니다.

def find_and_display_bird(video_path, bird_image_path):
    ## Function details will be added in the next steps

이 함수는 우리 프로젝트의 핵심이며, 대부분의 감지 로직이 여기에 위치할 것입니다.

✨ 솔루션 확인 및 연습

비디오 및 새 이미지 로드

이 단계에서는 스크립트가 감지 프로세스에 필수적인 OpenCV 를 사용하여 비디오 및 새 이미지 파일을 로드합니다.

    ## Load video and bird image
    cap = cv2.VideoCapture(video_path)
    bird = cv2.imread(bird_image_path)

    ## Check if files were loaded successfully
    if not cap.isOpened():
        print(f"Error: Could not open video {video_path}")
        return
    if bird is None:
        print(f"Error: Could not load bird image {bird_image_path}")
        return

로딩 과정 설명

  • cv2.VideoCapture(video_path): 이 함수는 비디오를 캡처하는 데 사용됩니다.
    • video_path는 비디오 파일의 경로입니다.
    • 비디오에서 프레임을 읽을 수 있게 해주는 비디오 캡처 객체 (cap) 를 반환합니다.
  • cv2.imread(bird_image_path): 이 함수는 지정된 파일에서 이미지를 읽습니다.
    • bird_image_path는 새 이미지의 경로입니다.
    • 이미지의 픽셀을 나타내는 다차원 배열 형태의 이미지 (bird) 를 반환합니다.

파일 로드 성공 여부 확인

  • 처리 중에 오류를 방지하기 위해 비디오 및 이미지 파일이 성공적으로 로드되었는지 확인하는 것이 중요합니다.
  • cap.isOpened(): 이 메서드는 비디오 캡처가 올바르게 초기화되었는지 확인합니다. False를 반환하면 비디오 파일을 열 수 없음을 의미합니다.
  • if bird is None: 이 조건은 새 이미지가 올바르게 로드되었는지 확인합니다. birdNone이면 이미지 파일을 읽을 수 없음을 의미합니다.

비디오 및 새 이미지를 올바르게 로드하는 것은 새 감지 프로세스의 기본 단계이며, 처리에 필요한 데이터가 액세스 가능하고 올바른 형식인지 확인합니다.

✨ 솔루션 확인 및 연습

프레임별 비디오 처리

이 단계에서는 스크립트가 OpenCV 의 두 가지 주요 함수인 cv2.matchTemplatecv2.minMaxLoc를 사용하여 비디오의 각 프레임을 처리하여 새를 감지합니다.

    print("Processing video...")

    ## Process video frame by frame
    while True:
        success, im = cap.read()
        if not success:
            break

        res = cv2.matchTemplate(im, bird, cv2.TM_CCOEFF)
        _, max_val, _, max_loc = cv2.minMaxLoc(res)

        ## Drawing and text annotation code will be added in the next step

cv2.matchTemplate 설명:

  • cv2.matchTemplate는 컴퓨터 비전에서 더 큰 이미지 내에서 하위 이미지를 찾는 방법인 템플릿 매칭 (template matching) 에 사용됩니다.
  • 이 함수에서:
    • im은 비디오의 현재 프레임입니다.
    • bird는 템플릿 이미지입니다 (이 경우, 우리가 찾고 있는 새 이미지).
    • cv2.TM_CCOEFF는 템플릿 매칭에 사용되는 방법입니다. OpenCV 에는 여러 가지 방법이 있지만, TM_CCOEFF는 매칭에 상관 계수를 사용하므로 이 목적에 효과적입니다.
  • 이 함수는 각 픽셀이 해당 픽셀의 이웃이 템플릿과 얼마나 일치하는지를 나타내는 그레이스케일 이미지 res를 반환합니다.

cv2.minMaxLoc 설명:

  • cv2.minMaxLoc는 그레이스케일 이미지에서 최소 및 최대 값의 위치를 찾는 데 사용됩니다.
  • 이 컨텍스트에서는 res 이미지에서 가장 높은 일치 영역을 찾는 데 사용됩니다.
    • 이 함수는 최소값, 최대값, 최소값의 위치 및 최대값의 위치의 네 가지 값을 반환합니다.
    • TM_CCOEFF의 경우, 최대값 (max_val) 과 해당 위치 (max_loc) 가 관심 대상이며, 이는 템플릿 (새) 이 가장 높은 일치를 보이는 지점을 나타냅니다.
  • max_loc는 프레임에서 새가 발견된 사각형의 왼쪽 상단 모서리를 제공합니다.

이 두 함수를 비디오의 각 프레임에 반복적으로 적용함으로써 스크립트는 각 프레임에서 새를 찾아 비디오가 재생될 때 실시간 감지를 가능하게 합니다. 이는 비디오 분석 및 컴퓨터 비전의 기본적인 기술로, 프레임 간의 객체 식별 및 추적을 가능하게 합니다.

✨ 솔루션 확인 및 연습

결과 주석 및 표시

이 단계에서는 스크립트가 감지된 새 영역을 사각형으로 표시하고 위치를 표시하여 각 프레임에 주석을 달고 표시합니다.

        ## Draw rectangle around the bird
        left, top = max_loc
        right, bottom = left + bird.shape[1], top + bird.shape[0]
        cv2.rectangle(im, (left, top), (right, bottom), 255, 2)

        ## Add text annotation for position
        position_text = f"Position: ({left}, {top})"
        cv2.putText(im, position_text, (left, top), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)

        ## Display the image
        cv2.imshow('Bird Detection', im)

        ## Break loop on 'q' key press
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

새 주위에 사각형 그리기:

  • cv2.rectangle(im, (left, top), (right, bottom), 255, 2): 이 함수는 프레임에 사각형을 그립니다.
    • 매개변수 (left, top)(right, bottom)은 사각형의 왼쪽 상단 및 오른쪽 하단 모서리를 정의합니다.
    • 255는 사각형의 색상 (이 경우 흰색) 을 설정합니다.
    • 2는 사각형 선의 두께입니다.

텍스트 주석 추가:

  • cv2.putText: 이 함수는 프레임에 텍스트를 넣습니다.
    • 프레임에서 새의 위치를 표시합니다.
    • position_text는 표시할 텍스트로, 감지된 새 영역의 왼쪽 상단 모서리를 보여줍니다.
    • 텍스트가 표시되는 위치는 사각형의 왼쪽 상단 모서리인 (left, top)으로 설정됩니다.
    • cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1은 텍스트의 글꼴 스타일, 크기, 색상 (흰색) 및 두께를 설정합니다.

이미지 표시:

  • cv2.imshow('Bird Detection', im): 이 함수는 사각형 및 텍스트 주석이 있는 현재 프레임을 표시합니다.
  • cv2.waitKey(1) & 0xFF == ord('q'): 이 줄은 스크립트가 짧은 시간 동안 프레임을 표시하고 'q' 키를 눌러 루프를 종료할 때까지 기다립니다. 이를 통해 주석이 있는 실시간 비디오 재생이 가능합니다.

실시간으로 결과를 주석 처리하고 표시하는 것은 새 감지 프로세스의 효과를 시각화하는 데 중요합니다. 이를 통해 사용자는 감지 과정을 실제로 확인하고 정확성을 검증할 수 있습니다.

✨ 솔루션 확인 및 연습

리소스 해제 및 창 닫기

비디오를 처리한 후 모든 리소스를 해제하고 열려 있는 모든 창을 닫습니다.

    ## Release resources and close windows
    cap.release()
    cv2.destroyAllWindows()
    print("Video processing complete.")

이 정리 단계는 파일과 창을 처리하는 모든 애플리케이션에서 효율적인 리소스 관리를 위해 중요합니다.

✨ 솔루션 확인 및 연습

예시 사용법

마지막으로, find_and_display_bird 함수를 사용하는 방법에 대한 예시를 제공합니다.

## Example usage
if __name__ == "__main__":
    find_and_display_bird('flappybird.mp4', 'bird.png')

이제 모든 단계를 완료했으므로 다음 명령을 사용하여 데스크톱 환경에서 코드를 실행할 수 있습니다.

cd ~/project
python bird_detection.py

✨ 솔루션 확인 및 연습

요약

이 프로젝트에서는 OpenCV 를 사용하여 비디오에서 새를 감지하는 Python 프로젝트를 설정하는 방법을 배웠습니다. 프로젝트 파일 생성, OpenCV 가져오기, 새 감지 함수 정의, 비디오 프레임 로드 및 처리, 결과 주석 처리 및 표시, 리소스 정리까지, 기본적인 컴퓨터 비전 애플리케이션을 구축하기 위한 모든 필수 단계를 거쳤습니다. 이 프로젝트는 Python 및 OpenCV 를 사용한 이미지 처리 및 컴퓨터 비전의 기본적인 기술로 작용합니다.