OpenCV (3)

Myeongsu Moon·2024년 11월 30일

제로베이스

목록 보기
30/95
post-thumbnail

Chapter3 도형과 텍스트

  • 캔버스 준비하기: 아무 값도 없기에 검은색으로 나옴
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()

  • 한글로 입력하기 위해서는 별도의 패키지 설치 필요
    pip install pillow
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)

Chapter4 마우스와 키보드 사용

이미지 조작하기

  • 마우스로 좌표 추출
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()
  • HSV로 진행해보기
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()

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

0개의 댓글