[python] OpenCV를 사용하여 이미지에서 동영상에서 원 감지하기

OpenCV는 컴퓨터 비전 및 이미지 처리에 대한 오픈 소스 라이브러리입니다. 이 라이브러리를 사용하면 다양한 이미지 및 비디오 처리 작업을 쉽게 수행할 수 있습니다. 이번 예제에서는 OpenCV를 사용하여 이미지에서 동영상에서 원을 감지하는 방법을 알아보겠습니다.

필요한 패키지 설치하기

먼저 OpenCV를 설치해야합니다. 아래 명령을 사용하여 필요한 패키지를 설치합니다.

pip install opencv-python-headless

이미지에서 원 감지하기

다음은 이미지에서 원을 감지하는 방법입니다. 원을 감지하기 위해 cv2.HoughCircles() 함수를 사용합니다.

import cv2
import numpy as np

# 이미지 불러오기
image = cv2.imread("image.jpg", 0)

# 이미지 전처리
image = cv2.medianBlur(image, 5)
image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)

# 원 감지
circles = cv2.HoughCircles(image, cv2.HOUGH_GRADIENT, 1, 20,
                           param1=50, param2=30, minRadius=0, maxRadius=0)

# 원 그리기
if circles is not None:
    circles = np.round(circles[0, :]).astype("int")
    for (x, y, r) in circles:
        cv2.circle(image, (x, y), r, (0, 255, 0), 4)

# 결과 이미지 출력
cv2.imshow("Circles", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

이미지에서 원을 감지하는 과정은 다음과 같습니다:

  1. cv2.imread() 함수를 사용하여 이미지를 불러옵니다.
  2. cv2.medianBlur() 함수를 사용하여 이미지를 전처리합니다.
  3. cv2.cvtColor() 함수를 사용하여 이미지를 회색조에서 BGR 형식으로 변환합니다.
  4. cv2.HoughCircles() 함수를 사용하여 원을 감지합니다. 이 함수는 이미지, 원을 감지하기 위한 메소드, 이미지 해상도, 최소 거리, Canny 엣지 검출에 사용되는 적지원 파라미터 등을 인자로 받습니다.
  5. cv2.circle() 함수를 사용하여 원을 그립니다.
  6. 결과 이미지를 출력합니다.

이제 위의 코드를 실행하면 이미지에서 원이 감지되는 것을 확인할 수 있습니다.

동영상에서 원 감지하기

OpenCV를 사용하면 동영상에서도 원을 감지할 수 있습니다. 동영상에서 원을 감지하는 방법은 이미지에서와 거의 동일합니다. 아래는 동영상에서 원을 감지하는 예제입니다.

import cv2
import numpy as np

# 동영상 열기
video = cv2.VideoCapture("video.mp4")

while True:
    # 프레임 읽기
    ret, frame = video.read()

    if not ret:
        break

    # 이미지 전처리
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.medianBlur(gray, 5)

    # 원 감지
    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20,
                               param1=50, param2=30, minRadius=0, maxRadius=0)

    # 원 그리기
    if circles is not None:
        circles = np.round(circles[0, :]).astype("int")
        for (x, y, r) in circles:
            cv2.circle(frame, (x, y), r, (0, 255, 0), 4)

    # 결과 동영상 출력
    cv2.imshow("Circles", frame)

    if cv2.waitKey(1) == ord("q"):
        break

# 동영상 종료
video.release()
cv2.destroyAllWindows()

위의 코드는 동영상에서 원을 감지하는 과정을 보여줍니다. 동영상은 cv2.VideoCapture() 함수를 사용하여 연 뒤, video.read() 함수를 사용하여 프레임을 읽어옵니다. 그리고 각 프레임에 대해 원을 감지하고 그려줍니다. ‘q’ 키를 누르면 동영상 재생이 멈춥니다.

이제 위의 코드를 실행하면 동영상에서 원이 감지되는 것을 확인할 수 있습니다.

결론

이번 예제에서는 OpenCV를 사용하여 이미지와 동영상에서 원을 감지하는 방법을 알아보았습니다. OpenCV는 높은 성능과 다양한 기능을 제공하여 컴퓨터 비전 및 이미지 처리 작업을 간편하게 수행할 수 있습니다.