[3일차] 영상에서 얼굴 인식해서 프레임 추출 하기

Luke·2025년 5월 26일
post-thumbnail

🗓️ 2025-05-26

최근에 시험 일정과 싸피 준비로 인해 프로젝트를 일주일 정도 쉬었습니다.
05-30(금요일)에 지금 IT's Your Life에서 알고리즘 중간 테스트가 있어서 조금씩 진행할 예정입니다.
중요한 부분이라 생각해서 천천히 각종 라이브러리와 부분적으로 진행하는게 좋을 거 같다는 생각이 들었습니다.


📃 진행 상황 표시

✅ 영상 수집
✅ 영상 다운로드 ⏳ (yt-dlp)
⚠️ 프레임 추출 ⏳ (OpenCV) - 기준 이미지 로딩 및 영상 접근까지 구현 완료
⬜ 얼굴 등록 ⏳ (face_recognition)
⬜ 얼굴 비교 및 탐지 ⏳
⬜ 결과 리포트 ⏳


✅ 오늘의 목표

  • 프로젝트 흐름 재점검 및 이어서 개발할 기반 준비하기

  • 기준 얼굴 이미지를 OpenCV로 불러오고 전처리하기

  • 영상 파일을 불러와 프레임을 탐색할 수 있는 구조 만들기

  • 이후 얼굴 매칭을 위한 RGB 기반 이미지 준비

🛠️ 진행한 작업

  • cv2.imread() 로 기준 이미지 로딩 및 예외 처리

  • cv2.cvtColor() 로 색상 공간 BGR → RGB 변환

  • cv2.VideoCapture() 로 영상 파일 로딩

  • 영상에서 읽은 프레임을 RGB로 변환

  • 매칭된 프레임 저장을 위한 cv2.imwrite() 사용 흐름 추가

📌 주요 코드 / 결과 캡처

📂 GitHub Repository
👉 프로젝트 코드 보러가기

# 1. 기준 이미지 로딩 및 색상 변환
reference_img = cv2.imread(reference_img_path)
if reference_img is None:
    print("[ERROR] 기준 이미지 로딩 실패 (None 반환)")
    return

rgb_img = cv2.cvtColor(reference_img, cv2.COLOR_BGR2RGB)

# 2. 영상 로딩
cap = cv2.VideoCapture(video_path)

# 3. 프레임 RGB 변환
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

# 4. 매칭된 프레임 저장
cv2.imwrite(save_path, frame)

🔎 참고: 아직 프레임 루프 (while cap.isOpened():) 는 작성 전 단계에 해당합니다.

🖥️ 콘솔 로그 출력 예시

✅ 현재까지 실제 출력된 로그 (3일차 기준)

[INFO] 기준 얼굴 로딩 중: C:/mini/sample2.jpg
[DEBUG] 기준 이미지 shape: (1499, 1000, 3)

기준 얼굴 이미지를 성공적으로 불러오고 RGB로 변환한 결과까지 확인된 상태입니다.

🔄 향후 추가될 예정인 출력 로그 예시 (face_recognition 및 프레임 매칭 구현 시)

[INFO] 기준 얼굴 감지 중 ...
[DEBUG] 감지 완료 - 소요 시간: 0.29초
[DEBUG] 감지된 얼굴 개수: 1
[INFO] 얼굴 인코딩 완료

[INFO] 영상 로딩 중: C:/mini/downloads/20250512.mp4
[INFO] 영상 탐색 중 ... 전체 프레임 수: 45

⚠️ 유사하지 않음: 기준 초과 (거리: 0.7115) → 무시
⚠️ 유사하지 않음: 기준 초과 (거리: 0.6408) → 무시
✅ 유사한 프레임 발견! (거리: 0.5296) → 저장

위 출력은 이후 프레임 루프 및 얼굴 유사도 비교가 구현되면 실제로 볼 수 있게 될 로그들입니다.

💡 오늘 배운 점 / 핵심 요약

  • OpenCV는 BGR 기본 포맷을 사용하므로, 얼굴 인식 전에 RGB로 변환이 필요합니다.

  • 영상 로딩은 cv2.VideoCapture()로 하고, 프레임 단위 접근이 가능함

  • 기준 이미지 로딩이 안 될 경우를 대비해 예외 처리를 꼭 해주는 게 중요

  • 결과 저장을 위한 cv2.imwrite()는 디버깅 및 리포트 단계에서 필수

❗ 어려웠던 점 & 해결 방법

  • 문제: 이미지가 로딩되지 않고 None으로 반환됨
    해결: 경로 설정 문제였고, if reference_img is None: 조건문으로 로그 처리함

  • 문제: 영상에서 프레임 단위 RGB 변환 위치가 헷갈림
    해결: 프레임 추출 전에 RGB 변환 흐름을 명확히 분리하여 처리

🤔 간단 회고

한동안 쉬었던 프로젝트를 다시 점검하고, 전체 흐름을 되짚으며 이어가는 데 집중했습니다.
이전에 구축했던 영상 다운로드 및 API 처리 구조를 확인하면서, 어떤 흐름으로 이어졌는지 정리하고 특히, 기준 얼굴 이미지 로딩을 진행하면서 감을 되찾아 갔습니다.

OpenCV를 대학시절에 사용한 경험이 있어서 쉽게 적용할 수 있을 거라 생각을 했으나 기준 이미지 하나를 불러오고 영상에 접근하는 단순한 기능처럼 보여도, 결국은 전체 파이프라인을 구성하는 데 핵심이 되는 기초 작업이라는 걸 다시 느꼈습니다.
OpenCV로 단순히 영상을 읽고 이미지를 변환하는 코드지만, 이 작업이 쌓여야 얼굴을 인식하고 비교하고 저장하는 흐름이 완성되는 것을 알았습니다.

특히 이전에는 라이브러리를 호출하는 것에만 집중했다면, 오늘은 각 함수의 작동 원리와 데이터 흐름을 조금 더 깊이 이해하려고 노력했습니다.
프레임을 읽는 타이밍, 변환 위치, 저장 방식 등을 고민하면서 "어떻게 작동할까"보다는 "왜 이렇게 설계해야 할까"라는 관점으로 전환되는 계기가 되었습니다.

하나씩 작동시켜보고, 직접 눈으로 결과를 확인하면서 시스템을 구성하는 것이 쉽지만은 않다는 것을 느꼈습니다.

profile
Data 0

0개의 댓글