😏기본 입출력

이미지 및 동영상 읽기

OpenCV의 가장 기본적인 작업은 이미지를 읽고 표시하고 저장하는 것입니다.

이미지 읽기 및 표시

import cv2

# 이미지 읽기
img_file = "path/to/image.jpg"
img = cv2.imread(img_file)  # 컬러 이미지로 읽기
img_gray = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)  # 흑백으로 읽기

# 이미지 표시
if img is not None:
    cv2.imshow('IMG', img)
    cv2.waitKey()  # 키 입력 대기
    cv2.destroyAllWindows()  # 창 닫기

이미지 저장

# 이미지 저장
cv2.imwrite('저장할경로.jpg', img)

cv2.imread() 플래그:

  • cv2.IMREAD_COLOR (기본값): 컬러 이미지로 읽기

  • cv2.IMREAD_GRAYSCALE: 흑백으로 읽기

  • cv2.IMREAD_UNCHANGED: 투명도 포함하여 그대로 읽기

웹캠 사용

# 웹캠 연결
cap = cv2.VideoCapture(0)  # 0번 카메라

if cap.isOpened():
    while True:
        ret, img = cap.read()
        if ret:
            cv2.imshow('camera', img)
            if cv2.waitKey(1) != -1:  # 아무 키나 누르면 종료
                break
cap.release()
cv2.destroyAllWindows()

도형 그리기

OpenCV에서 이미지에 다양한 도형을 그릴 수 있습니다.

직선 그리기

cv2.line(img, start, end, color, thickness, lineType)

파라미터:

  • img: 그림을 그릴 이미지

  • start: 시작 좌표 (x, y)

  • end: 끝 좌표 (x, y)

  • color: BGR 색상 (예: (255, 0, 0) = 파란색)

  • thickness: 선 두께 (기본값: 1)

  • lineType: 선 타입 (cv2.LINE_AA 권장)

# 예시
cv2.line(img, (50, 50), (200, 50), (255, 0, 0), 2)  # 파란색 선

사각형 그리기

cv2.rectangle(img, start, end, color, thickness)
# 예시
cv2.rectangle(img, (50, 50), (150, 150), (0, 255, 0), 2)  # 초록색 사각형
cv2.rectangle(img, (200, 200), (300, 300), (0, 0, 255), -1)  # 빨간색 채워진 사각형

원 그리기

cv2.circle(img, center, radius, color, thickness)
# 예시
cv2.circle(img, (150, 150), 50, (255, 0, 0), 3)  # 파란색 원
cv2.circle(img, (300, 300), 30, (0, 255, 0), -1)  # 초록색 채워진 원

다각형 그리기

import numpy as np

# 좌표 정의
pts = np.array([[100, 100], [200, 50], [300, 100], [250, 200], [150, 200]], 
               dtype=np.int32)

cv2.polylines(img, [pts], True, (0, 0, 255), 2)  # 닫힌 다각형

타원 그리기

cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness)
# 예시
cv2.ellipse(img, (200, 200), (100, 50), 0, 0, 360, (255, 0, 0), 2)  # 타원
cv2.ellipse(img, (200, 200), (50, 50), 0, 0, 180, (0, 255, 0), 2)  # 반원

텍스트 그리기

cv2.putText(img, text, org, font, fontScale, color, thickness)
# 예시
cv2.putText(img, "Hello OpenCV", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 
            1, (255, 255, 255), 2)

폰트 종류:

  • cv2.FONT_HERSHEY_SIMPLEX: 기본 Sans-serif

  • cv2.FONT_HERSHEY_COMPLEX: Serif 폰트

  • cv2.FONT_HERSHEY_SCRIPT_SIMPLEX: 손글씨체


창 관리 및 이벤트 처리

창 관리 함수들

# 창 생성
cv2.namedWindow('window_name', cv2.WINDOW_NORMAL)

# 창 위치 이동
cv2.moveWindow('window_name', x, y)

# 창 크기 조절
cv2.resizeWindow('window_name', width, height)

# 특정 창 닫기
cv2.destroyWindow('window_name')

# 모든 창 닫기
cv2.destroyAllWindows()

창 옵션:

  • cv2.WINDOW_NORMAL: 크기 조절 가능

  • cv2.WINDOW_AUTOSIZE: 이미지 크기에 맞춤 (기본값)

키보드 이벤트 처리

while True:
    key = cv2.waitKey(0) & 0xFF  # 키 입력 대기
    
    if key == ord('q') or key == 27:  # 'q' 또는 ESC
        break
    elif key == ord('s'):  # 's' 키
        cv2.imwrite('saved.jpg', img)
        print("이미지 저장됨")

마우스 이벤트 처리

def mouse_callback(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:  # 왼쪽 버튼 클릭
        cv2.circle(img, (x, y), 20, (0, 255, 0), -1)
        cv2.imshow('image', img)
    
    elif event == cv2.EVENT_RBUTTONDOWN:  # 오른쪽 버튼 클릭
        cv2.circle(img, (x, y), 20, (255, 0, 0), -1)
        cv2.imshow('image', img)

# 마우스 콜백 등록
cv2.setMouseCallback('image', mouse_callback)

마우스 이벤트 종류:

  • cv2.EVENT_LBUTTONDOWN: 왼쪽 버튼 누름

  • cv2.EVENT_RBUTTONDOWN: 오른쪽 버튼 누름

  • cv2.EVENT_MOUSEMOVE: 마우스 이동

  • cv2.EVENT_LBUTTONDBLCLK: 왼쪽 버튼 더블클릭

플래그 활용

def mouse_callback_with_flags(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        if flags & cv2.EVENT_FLAG_CTRLKEY:  # Ctrl + 클릭
            color = (0, 0, 255)  # 빨간색
        elif flags & cv2.EVENT_FLAG_SHIFTKEY:  # Shift + 클릭
            color = (255, 0, 0)  # 파란색
        else:
            color = (0, 255, 0)  # 초록색
        
        cv2.circle(img, (x, y), 20, color, -1)
        cv2.imshow('image', img)