
import cv2
import numpy as np
# 빈 캔버스 생성 (검은색 배경)
canvas = np.zeros(shape=(500, 500, 3), dtype=np.uint8)
cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 사각형의 시작점 좌표와 끝점 좌표
start_point = (150, 150) # 시작점 좌표 (x, y)
end_point = (350, 350) # 끝점 좌표 (x, y)
# 사각형 그리기
cv2.rectangle(
img=canvas,
pt1=start_point,
pt2=end_point,
color=(0, 255, 255),
thickness=3
)

# 사각형의 시작점 좌표와 끝점 좌표
start_point = (150, 353) # 시작점 좌표 (x, y)
end_point = (350, 450) # 끝점 좌표 (x, y)
# 사각형 그리기
cv2.rectangle(
img=canvas,
pt1=start_point,
pt2=end_point,
color=(42, 42, 165),
thickness=-1 # 채우기
)

# 원의 중심 좌표
center_coordinates = (220, 220)
# 원 그리기
cv2.circle(
img=canvas,
center=center_coordinates,
radius=30,
color=(255, 255, 255),
thickness=0
)

# 타원의 중심 좌표
center_coordinates = (280, 250)
# 타원의 축 길이 (가로 반지름, 세로 반지름)
axes_length = (30, 10)
# 타원 그리기
cv2.ellipse(
img=canvas,
center=center_coordinates,
axes=axes_length,
angle=0,
startAngle=0,
endAngle=360,
color=(0, 255, 255),
thickness=0
)

Angle을 조절해서 타원은 다 그리지 않을 수도 있음
삼각형 그리기
# 꼭짓점 좌표
points = np.array([[250, 150], [150, 350], [350, 350]])
# 다각형 그리기
cv2.polylines(
img=canvas,
pts=[points],
isClosed=True,
color=(0, 0, 255),
thickness=3
)

도형을 그릴때는 순서가 중요함
선 그리기
# 선 그리기
cv2.line(
img=canvas,
pt1=(150, 350),
pt2=(350, 350),
color=(255, 0, 0),
thickness=2
)
# 점 그리기
cv2.circle(
img=canvas,
center=(250, 250),
radius=5,
color=(255, 0, 255),
thickness=-1
)

import cv2
img = cv2.imread('example_512.png')
# 텍스트 삽입
text = "Nabi"
font = cv2.FONT_HERSHEY_SIMPLEX # 글꼴 설정
position = (50, 50) # 텍스트가 시작될 좌표
font_scale = 1 # 폰트 크기
color = (0, 255, 0) # 녹색 텍스트
thickness = 2 # 텍스트 두께
cv2.putText(img, text, position, font, font_scale, color, thickness)
cv2.imshow('Image with Text', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

img = cv2.imread('example_512.png')
from PIL import Image, ImageDraw, ImageFont
# OpenCV 이미지를 PIL 이미지로 변환
img_pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# PIL을 사용하여 텍스트 그리기
draw = ImageDraw.Draw(img_pil)
# 원하는 폰트 파일 경로로 변경
font = ImageFont.truetype("C:/Windows/Fonts/malgun.ttf", 40)
position = (50, 50)
color = (0, 255, 0)
draw.text(position, "나비", font=font, fill=color)
# PIL 이미지를 다시 OpenCV 이미지로 변환
img = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)

import cv2
# 마우스 콜백 함수
def click_event(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print("Coordinates of Point:", x, y)
src = cv2.imread('example_512.png')
cv2.imshow('image', src)
# 마우스 콜백 함수 설정
cv2.setMouseCallback('image', click_event)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
# 마우스 콜백 함수
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
cv2.circle(img, (x, y), 5, (255, 0, 0), -1)
cv2.imshow('image', img)
img = cv2.imread('example_512.png')
cv2.imshow('image', img)
# 마우스 콜백 함수 설정
cv2.setMouseCallback('image', draw_circle)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 마우스 콜백 함수
def callback(event, x, y, flags, param):
global canvas, img_temp, drawing, start_point
if event == cv2.EVENT_LBUTTONDOWN:
img_temp = canvas.copy()
drawing = True
start_point = (x, y)
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
canvas = img_temp.copy()
cv2.line(canvas, start_point, (x, y), (255, 255, 255), 5)
elif event == cv2.EVENT_LBUTTONUP:
cv2.line(canvas, start_point, (x, y), (255, 255, 255), 5)
drawing = False
img_temp = canvas.copy()
img_temp = None
drawing = False
start_point = None
canvas = np.zeros((512, 512, 3), np.uint8)
img_temp = canvas.copy()
cv2.imshow('canvas', canvas)
cv2.setMouseCallback('canvas', callback)
while True:
cv2.imshow('canvas', canvas)
key = cv2.waitKey(1)
if key == 27: # ESC 키 입력시 루프 탈출
break
cv2.destroyAllWindows()

def callback(event, x, y, flags, param):
global canvas, img_temp, drawing, start_point
if event == cv2.EVENT_LBUTTONDOWN:
img_temp = canvas.copy()
drawing = True
start_point = (x, y)
elif event == cv2.EVENT_MOUSEMOVE:
canvas = img_temp.copy() # 기존 이미지를 복사
if drawing:
color = (255, 255, 255) # 기본 색상: 흰색
# Ctrl 키를 누르고 있을 경우 빨간색으로 그림
if flags & cv2.EVENT_FLAG_CTRLKEY:
color = (0, 0, 255)
cv2.line(canvas, start_point, (x, y), color, 5)
elif event == cv2.EVENT_LBUTTONUP:
color = (255, 255, 255)
if flags & cv2.EVENT_FLAG_CTRLKEY:
color = (0, 0, 255)
cv2.line(canvas, start_point, (x, y), color, 5)
drawing = False
img_temp = canvas.copy()


import cv2
import numpy as np
img = np.zeros((300, 600, 3), np.uint8)
# 트랙바 콜백 함수
def nothing(x):
pass
cv2.namedWindow('image')
# RGB 트랙바 생성
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)
while True:
cv2.imshow('image', img)
key = cv2.waitKey(1)
if key == 27: # ESC 키를 누르면 종료
break
# 트랙바 위치 읽기
r = cv2.getTrackbarPos('R', 'image')
g = cv2.getTrackbarPos('G', 'image')
b = cv2.getTrackbarPos('B', 'image')
# 읽은 트랙바 위치에 따라 이미지 색상 변경
img[:] = [b, g, r]
cv2.destroyAllWindows()
cv2.namedWindow('HSV Color Adjust')
# HSV 트랙바 생성
cv2.createTrackbar('H', 'HSV Color Adjust', 0, 179, nothing)
cv2.createTrackbar('S', 'HSV Color Adjust', 0, 255, nothing)
cv2.createTrackbar('V', 'HSV Color Adjust', 0, 255, nothing)
while True:
cv2.imshow('HSV Color Adjust', img)
key = cv2.waitKey(1)
if key == 27: # ESC 키를 누르면 종료
break
# 트랙바 위치 읽기
h = cv2.getTrackbarPos('H', 'HSV Color Adjust')
s = cv2.getTrackbarPos('S', 'HSV Color Adjust')
v = cv2.getTrackbarPos('V', 'HSV Color Adjust')
# HSV 색상 설정
hsv_color = np.uint8([[[h, s, v]]])
rgb_color = cv2.cvtColor(hsv_color, cv2.COLOR_HSV2BGR)
img[:] = rgb_color
cv2.destroyAllWindows()

이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다