OpenCV를 사용하여 원 그리는 방법
[공지사항] 지킬블로그 안내드립니다.
지킬 블로그에 대하여 알아보겠습니다.
import numpy as np
import cv2
width, height = 512, 512
x, y, R = 256, 256, 50
direction = 0 # 방향
while True:
key = cv2.waitKeyEx(30) # 키 입력을 30ms 기다린다.
# Esc 입력이면 브레이크 ( 반복문 중단 )
if key == 0x1B:
break
# 방향키 방향전환
elif key == 0x270000: # right
direction = 0
elif key == 0x280000: # down
direction = 1
elif key == 0x250000: # left
direction = 2
elif key == 0x280000: # up
direction = 3
# 방향으로 이동
if direction == 0: # right
x += 10
elif direction == 1: # down
y += 10
elif direction == 2: # left
x -= 10
else: # 3, up
y -= 10
# 경계확인
if x < R:
x = R
direction = 0
if x > width - R:
x = width - R
direction = 2
if y < R:
y = R
direction = 1
if y > height - R:
y = height - R
direction = 3
# 원의 좌표가 바뀐다는 것은 원이 다른 위치에 그려져야 한다는 뜻 전부 하얀색으로 친다.
img = np.zeros((width, height,3), np.uint8) + 255 # 지우기
cv2.circle(img, (x, y), R, (0, 0, 255), -1)
cv2.imshow('img', img)
cv2.destroyAllWindows()
- 이미지 초기화:
width와height변수에는 이미지의 너비와 높이를 지정합니다. 이 예제에서는 512x512 이미지를 생성합니다.x,y,R변수에는 원의 초기 위치와 반지름을 지정합니다. 여기서는 (256, 256) 위치에 반지름이 50인 원을 생성합니다.direction변수는 원의 이동 방향을 나타내는 변수입니다. 여기서는 오른쪽을 기본 이동 방향으로 설정합니다.
- 무한 루프:
- 이 코드는 사용자의 입력을 받아 원을 이동시키기 위해 무한 루프를 사용합니다.
- 키 입력 대기:
cv2.waitKeyEx(30)함수를 사용하여 30밀리초 동안 사용자의 키 입력을 대기합니다.
- 키 입력 처리:
- 사용자가 키보드를 누르면 해당하는 키 코드가 반환됩니다.
- ESC 키가 눌리면 루프를 탈출하여 프로그램을 종료합니다.
- 화살표 키에 따라 원의 이동 방향을 설정합니다.
- 원의 이동:
- 원의 이동 방향에 따라
x와y값을 조정하여 원을 이동시킵니다.
- 원의 이동 방향에 따라
- 경계 확인:
- 원의 위치가 이미지 경계를 벗어나지 않도록 조정합니다. 이동 후에 원의 중심이 이미지 경계를 벗어나면 원의 중심을 경계에 맞춥니다.
- 이미지 업데이트:
np.zeros()함수를 사용하여 흰색 이미지를 생성합니다.cv2.circle()함수를 사용하여 원을 그립니다. 이 때,x,y좌표와 반지름을 설정하고, 빨간색으로 채웁니다.cv2.imshow()함수를 사용하여 이미지를 화면에 표시합니다.
- 반복문 종료:
cv2.destroyAllWindows()함수를 호출하여 모든 창을 닫습니다.
import numpy as np
import cv2
width, height = 512, 512
x, y, R = 256, 256, 50
step = 10
while True:
img = np.zeros((height, width, 3), np.uint8) + 255 # 흰색 배경으로 초기화
cv2.circle(img, (x, y), R, (0, 0, 255), -1) # 원 그리기
cv2.imshow('img', img) # 이미지 표시
key = cv2.waitKeyEx(0) # 키 입력을 무한정 대기
# Esc 키 (0x1B)를 누르면 반복문 종료
if key == 0x1B:
break
# 방향키 입력에 따라 원 이동
if key == 0x270000: # 오른쪽 방향키
x += step
elif key == 0x280000: # 아래쪽 방향키
y += step
elif key == 0x250000: # 왼쪽 방향키
x -= step
elif key == 0x260000: # 위쪽 방향키
y -= step
# 경계 확인
if x < R:
x = R
if x > width - R:
x = width - R
if y < R:
y = R
if y > height - R:
y = height - R
cv2.destroyAllWindows()
- 라이브러리 임포트:
- 우선 코드의 첫 부분에서는 필요한 라이브러리를 임포트합니다.
numpy는 다차원 배열을 다루는 파이썬 라이브러리이며,cv2는 OpenCV 라이브러리입니다.
- 변수 초기화:
width와height변수에는 이미지의 너비와 높이를 설정합니다. 여기서는 512x512의 이미지를 생성합니다.x,y,R변수는 원의 초기 위치와 반지름을 나타냅니다.step변수는 한 번에 이동할 픽셀 수를 나타냅니다.
- 무한 루프:
while True:를 사용하여 무한 루프를 생성합니다. 이 루프는 사용자가 프로그램을 종료할 때까지 계속됩니다.
- 이미지 생성:
np.zeros()함수를 사용하여 흰색 배경의 이미지를 생성합니다. 이 이미지는 모든 픽셀의 값이 255인 흰색 이미지입니다.- 이 이미지는 원을 그리는 캔버스로 사용됩니다.
- 원 그리기:
cv2.circle()함수를 사용하여 이미지에 원을 그립니다.(x, y)좌표를 중심으로 하는 반지름이R인 빨간색 원을 그립니다.
- 이미지 표시:
cv2.imshow()함수를 사용하여 이미지를 화면에 표시합니다.
- 키 입력 대기:
cv2.waitKeyEx(0)함수를 사용하여 키보드 입력을 무한정 대기합니다.- 이 함수는 0 밀리초 동안 키 입력을 기다리며, 0을 전달하면 무한정 대기합니다.
- 키 입력 처리:
- 사용자가 특정 키를 누르면 해당하는 키 코드가 반환됩니다.
- ESC 키가 눌리면 (
0x1B), 무한 루프를 종료하고 프로그램이 종료됩니다. - 화살표 키를 누르면 해당 방향으로 원이 이동합니다.
- 경계 확인:
- 원의 위치가 이미지 경계를 벗어나지 않도록 확인합니다.
- 이미지의 경계를 벗어나면 원의 위치를 조정합니다.
- 창 닫기:
cv2.destroyAllWindows()함수를 호출하여 모든 창을 닫습니다.
이제 코드가 어떻게 동작하는지 더 자세히 이해하셨을 것입니다
댓글남기기