GitHub 블로그
유튜브 영상     깃허브 프로필

3 분 소요

[공지사항] 지킬블로그 안내드립니다.

지킬 블로그에 대하여 알아보겠습니다.

버튼입니다

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()

  1. 이미지 초기화:
    • widthheight 변수에는 이미지의 너비와 높이를 지정합니다. 이 예제에서는 512x512 이미지를 생성합니다.
    • x, y, R 변수에는 원의 초기 위치와 반지름을 지정합니다. 여기서는 (256, 256) 위치에 반지름이 50인 원을 생성합니다.
    • direction 변수는 원의 이동 방향을 나타내는 변수입니다. 여기서는 오른쪽을 기본 이동 방향으로 설정합니다.
  2. 무한 루프:
    • 이 코드는 사용자의 입력을 받아 원을 이동시키기 위해 무한 루프를 사용합니다.
  3. 키 입력 대기:
    • cv2.waitKeyEx(30) 함수를 사용하여 30밀리초 동안 사용자의 키 입력을 대기합니다.
  4. 키 입력 처리:
    • 사용자가 키보드를 누르면 해당하는 키 코드가 반환됩니다.
    • ESC 키가 눌리면 루프를 탈출하여 프로그램을 종료합니다.
    • 화살표 키에 따라 원의 이동 방향을 설정합니다.
  5. 원의 이동:
    • 원의 이동 방향에 따라 xy 값을 조정하여 원을 이동시킵니다.
  6. 경계 확인:
    • 원의 위치가 이미지 경계를 벗어나지 않도록 조정합니다. 이동 후에 원의 중심이 이미지 경계를 벗어나면 원의 중심을 경계에 맞춥니다.
  7. 이미지 업데이트:
    • np.zeros() 함수를 사용하여 흰색 이미지를 생성합니다.
    • cv2.circle() 함수를 사용하여 원을 그립니다. 이 때, x, y 좌표와 반지름을 설정하고, 빨간색으로 채웁니다.
    • cv2.imshow() 함수를 사용하여 이미지를 화면에 표시합니다.
  8. 반복문 종료:
    • 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()
  1. 라이브러리 임포트:
    • 우선 코드의 첫 부분에서는 필요한 라이브러리를 임포트합니다.
    • numpy는 다차원 배열을 다루는 파이썬 라이브러리이며, cv2는 OpenCV 라이브러리입니다.
  2. 변수 초기화:
    • widthheight 변수에는 이미지의 너비와 높이를 설정합니다. 여기서는 512x512의 이미지를 생성합니다.
    • x, y, R 변수는 원의 초기 위치와 반지름을 나타냅니다.
    • step 변수는 한 번에 이동할 픽셀 수를 나타냅니다.
  3. 무한 루프:
    • while True:를 사용하여 무한 루프를 생성합니다. 이 루프는 사용자가 프로그램을 종료할 때까지 계속됩니다.
  4. 이미지 생성:
    • np.zeros() 함수를 사용하여 흰색 배경의 이미지를 생성합니다. 이 이미지는 모든 픽셀의 값이 255인 흰색 이미지입니다.
    • 이 이미지는 원을 그리는 캔버스로 사용됩니다.
  5. 원 그리기:
    • cv2.circle() 함수를 사용하여 이미지에 원을 그립니다.
    • (x, y) 좌표를 중심으로 하는 반지름이 R인 빨간색 원을 그립니다.
  6. 이미지 표시:
    • cv2.imshow() 함수를 사용하여 이미지를 화면에 표시합니다.
  7. 키 입력 대기:
    • cv2.waitKeyEx(0) 함수를 사용하여 키보드 입력을 무한정 대기합니다.
    • 이 함수는 0 밀리초 동안 키 입력을 기다리며, 0을 전달하면 무한정 대기합니다.
  8. 키 입력 처리:
    • 사용자가 특정 키를 누르면 해당하는 키 코드가 반환됩니다.
    • ESC 키가 눌리면 (0x1B), 무한 루프를 종료하고 프로그램이 종료됩니다.
    • 화살표 키를 누르면 해당 방향으로 원이 이동합니다.
  9. 경계 확인:
    • 원의 위치가 이미지 경계를 벗어나지 않도록 확인합니다.
    • 이미지의 경계를 벗어나면 원의 위치를 조정합니다.
  10. 창 닫기:
    • cv2.destroyAllWindows() 함수를 호출하여 모든 창을 닫습니다.

이제 코드가 어떻게 동작하는지 더 자세히 이해하셨을 것입니다

댓글남기기