이미지 및 동영상 읽기
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)