오늘은 파이썬을 통해서 이미지 인식 시스템을 구축하는 예제를 진행해보겠습니다.
가장 접근성이 좋고 강력한 라이브러리가 많은 Python을 추천합니다.
프로그램 준비물
Python (3.9 이상): 메인 언어
OpenCV (cv2): 영상의 프레임을 읽고, 점수판 영역을 이미지로 처리하는 데 필수적입니다.
OCR 엔진 (텍스트 인식): 점수판의 숫자를 읽어야 합니다.
Tesseract-OCR: 가장 대중적이며 가볍습니다.
EasyOCR: 딥러닝 기반으로 정확도가 높지만 리소스를 더 사용합니다.
MoviePy: 인식된 시간대를 기준으로 영상을 자르고(Cut) 저장할 때 편리합니다.
Pandas: 점수 변화 기록 및 타임라인 데이터를 관리할 때 유용합니다.
패키지 정리
pip install opencv-python pytesseract yt-dlp Pillow
파이썬 외부 패키지 외부 소프트웨어 (System Programs)
파이썬 패키지 외에 컴퓨터 자체에 설치되어 있어야 하는 프로그램들입니다.
① Tesseract-OCR (문자 인식 엔진)
이 프로그램이 없으면 점수판의 숫자를 읽을 수 없습니다.
다운로드: Tesseract OCR 윈도우용 설치 파일
주의사항: 설치 경로를 꼭 기억해 두세요. 보통 C:\Program Files\Tesseract-OCR\tesseract.exe에 설치됩니다.
코드 수정: 코드 상단의 pytesseract.pytesseract.tesseract_cmd 경로를 새 컴퓨터의 설치 경로와 일치시켜야 합니다.
https://github.com/tesseract-ocr/tesseract
GitHub - tesseract-ocr/tesseract: Tesseract Open Source OCR Engine (main repository)
Tesseract Open Source OCR Engine (main repository) - tesseract-ocr/tesseract
github.com
② FFmpeg (영상 편집 도구)
영상을 자르고 합치는 "가위" 역할을 합니다.
다운로드: FFmpeg 공식 사이트(https://www.ffmpeg.org/)
FFmpeg
Converting video and audio has never been so easy. $ ffmpeg -i input.mp4 output.avi News August 22nd, 2025, FFmpeg 8.0 "Huffman" A new major release, FFmpeg 8.0 "Huffman", is now available for download. Thanks to several delays, and modernization of
www.ffmpeg.org
환경 변수 설정: 설치 후 ffmpeg 명령어를 어느 폴더에서나 쓸 수 있도록 시스템 환경 변수(Path)에 등록해야 합니다. (등록하지 않으면 프로그램에서 'ffmpeg를 찾을 수 없다'는 에러가 발생합니다.)
3. 이동 및 실행 체크리스트
다른 곳으로 옮긴 후 실행하기 전, 다음 3가지를 꼭 확인하세요.
Tesseract 경로 확인: 새 컴퓨터의 Tesseract 설치 경로가 코드와 맞는지 확인합니다.
FFmpeg 작동 여부: CMD창에 ffmpeg -version을 입력했을 때 버전 정보가 나오는지 확인합니다.
yt-dlp 최신 버전 유지: 유튜브 다운로드 속도가 다시 느려진다면 pip install -U yt-dlp를 실행하세요.
pyinstaller --noconsole --onefile fencing_master.py
기술적 원리 (Technical Background)
이 프로그램은 단순한 영상 편집기가 아니라, 컴퓨터 비전(Computer Vision) 기술의 집약체입니다.
Image Preprocessing: 숫자 인식률을 높이기 위해 이미지를 3배 확대하고 흑백 이진화 처리를 거칩니다.
Tesseract OCR: 구글의 오픈소스 엔진을 사용해 이미지 속 숫자를 실시간 텍스트로 변환합니다.
FFmpeg Integration: 영상의 손실 없이 고속으로 컷팅하고 이어 붙이는 강력한 엔진을 탑재했습니다.
1. 고속 비디오 로딩 및 점프 분석
모든 프레임을 읽지 않고 사용자가 설정한 간격만큼 건너뛰며 분석하여 속도를 극대화합니다.
# 분석 간격(f_skip)만큼 프레임을 점프하여 시간 단축
cap.set(cv2.CAP_PROP_POS_FRAMES, current_index + f_skip)
- 원리: 30fps 영상에서 f_skip=30으로 설정하면 1초에 단 한 번만 OCR을 수행하므로 전체 분석 시간이 획기적으로 줄어듭니다.
2. OCR 인식률을 높이는 이미지 전처리
Tesseract가 작은 숫자를 잘 읽을 수 있도록 이미지를 가공하는 과정입니다. 이 단계가 없으면 점수 인식이 거의 불가능합니다.
def get_val(roi):
# 1. 지정한 영역(ROI) 잘라내기
sub = frame[y:y+h, x:x+w]
# 2. 흑백 전환 (색상 정보 제거)
gray = cv2.cvtColor(sub, cv2.COLOR_BGR2GRAY)
# 3. 3배 확대 (인식률 대폭 향상)
res = cv2.resize(gray, None, fx=3, fy=3, interpolation=cv2.INTER_CUBIC)
# 4. 이진화 (배경은 검게, 글자는 하얗게 명확히 분리)
_, th = cv2.threshold(res, 180, 255, cv2.THRESH_BINARY_INV)
# 5. Tesseract 실행 (숫자 전용 모드)
txt = pytesseract.image_to_string(th, config="--psm 10 -c tessedit_char_whitelist=0123456789")
return int(txt) if txt.strip() else None
3. "Strict +1" 논리 필터
OCR 오류(0을 2나 7로 읽는 경우)를 잡아내는 가장 중요한 로직입니다.
def validate_side(raw, confirmed):
# 현재 확정된 점수(confirmed)보다 정확히 1점 높을 때만 인정
if raw == confirmed + 1:
return raw, True # 득점 인정
return confirmed, False # 오인식으로 판단하여 무시
- 효과: $0:0$ 상황에서 갑자기 $0:2$로 인식되더라도, $+1$ 법칙에 어긋나므로 무시하고 다음 프레임을 기다립니다.
4. 응답 없음 방지 (멀티스레딩)
다운로드나 영상 분석 같은 무거운 작업이 돌아가는 동안에도 GUI 창이 멈추지 않게 합니다.
import threading
def start_thread(self):
# 메인 UI와 별개로 'run_analysis' 함수를 백그라운드에서 실행
thread = threading.Thread(target=self.run_analysis, daemon=True)
thread.start()
- 효과: 분석 중에 사용자가 창을 옮기거나 로그를 실시간으로 확인할 수 있습니다.
5. FFmpeg 고속 클립 추출 및 자동 병합
인코딩 과정 없이 영상을 자르고 붙여 화질 손실 없이 순식간에 결과물을 만듭니다.
# 1. 개별 클립 고속 추출 (-c copy 옵션으로 무인코딩 잘라내기)
subprocess.run(['ffmpeg', '-ss', start, '-t', duration, '-i', input, '-c', 'copy', output])
# 2. 추출된 클립들을 하나로 합치기 (concat 기능)
subprocess.run(['ffmpeg', '-f', 'concat', '-safe', '0', '-i', 'list.txt', '-c', 'copy', 'fin
생각보다 잘 나와있어서 편하게 만들수 있네요.
'Programming > Python' 카테고리의 다른 글
| 빅데이터 분석기사 실기 3유형 (0) | 2025.06.11 |
|---|---|
| 빅데이터 분석기사 예제문제 2유형 (0) | 2025.06.11 |
| 빅데이터 분석기사 6월 실기 1유형 (0) | 2025.06.11 |
| 파이썬 pyinstaller 용량 줄이기 (0) | 2025.03.05 |
| CloudScraper로 크롤링 우회하기 (0) | 2024.11.21 |