OpenCV/OpenCV 강좌

두 점 사이의 각도를 구하는 OpenCV Python 예제 코드

webnautes 2024. 4. 25. 23:37
반응형

두 점 사이의 각도 구하는 OpenCV Python 예제 코드입니다.



2024. 4. 25  최초작성


 

 

 

실행결과는 유튜브 영상을 참고하세요.

https://youtu.be/T2InIT7b7_U?si=gxb6zTbeT8164cap

 

 





두 점 사이의 각도는 아래 그림처럼 표시됩니다.



이미지 출처 

https://stackoverflow.com/questions/28226833/get-angle-in-terms-of-360-degrees




영상에서 사용한 전체 코드입니다.

 

import cv2
import numpy as np
import queue
import math


# 마우스 이벤트를 캡처합니다.
def mouse_callback(event, x, y, flags, param):

    # 왼쪽 마우스 버튼 클릭 이벤트를 캡처합니다.
    if event == cv2.EVENT_LBUTTONDOWN:
        print(f'(x,y)=({x}, {y})')

        # 큐에 마우스 클릭했을 때 마우스 커서의 좌표를 넣습니다.
        q.put((x, y))


# 마우스 이벤트를 캡처하는 핸들러 함수로부터 좌표를 받아올때 사용합니다.
q = queue.Queue()

# 윈도우를 생성하고 마우스 이벤트 핸들러 함수를 등록합니다.
cv2.namedWindow('result')
cv2.setMouseCallback('result', mouse_callback)


# 빈 이미지를 생성합니다.
img = np.zeros((800,800,3), np.uint8)

# 가독성을 위해 상수로 선언합니다.
green_color = (0, 255, 0)
yellow_color = (0, 255, 255)
esc_key = 27


# 몇번째 클릭인지 구분하기 위해 사용됩니다.
count = 0
# 이전 마우스 클릭 위치를 저장합니다.
pre_pos = None


# 무한 반복하며 마우스 클릭이 일어나기를 대기합니다.
while(True):

    # 큐에 데이터가 쌓이기를 기다립니다.
    if not q.empty():

        # 카운트를 증가시킵니다.
        count = count + 1

        # 큐에서 마우스 클릭 위치를 가져옵니다.
        pos = q.get()
        # x,y 좌표로 분리합니다.
        x,y = pos


        # 첫번째 클릭일 경우 녹색원 안에 S를 표시하고 좌표를 저장합니다.
        if count == 1:
            cv2.circle(img, pos, 20, green_color, 1)
            cv2.putText(img, 'S', (x-10, y+10), cv2.FONT_HERSHEY_SIMPLEX, 1, green_color, 1)

            pre_pos = pos

        # 두번쨰 클릭일 경우 노란색 원안에 E를 표시하고 시작점과 끝점을 선으로 잇습니다. 두 점 사이의 각도를 계산하여 화면에 출력해줍니다.
        elif count == 2:
            cv2.circle(img, pos, 20, yellow_color, 1)
            cv2.putText(img, 'E', (x-10, y+10), cv2.FONT_HERSHEY_SIMPLEX, 1, yellow_color, 1

            cv2.line(img, pre_pos, pos, (255, 255, 255), 2)  


            # 두 점 사이의 각도 계산 (라디안)
            x1,y1 = pre_pos
            x2,y2 = pos
            angle_radians = math.atan2(y2 - y1, x2 - x1)

            # 각도를 도로 변환
            angle_degrees = math.degrees(angle_radians)


            # 각도가 반시계 방향으로 증가하도록 조정
            angle_degrees = -angle_degrees

            # 음수 각도를 0~360도 범위로 조정
            if angle_degrees < 0:
                angle_degrees += 360

            cv2.putText(img, str(int(angle_degrees)), (x, y-30), cv2.FONT_HERSHEY_SIMPLEX, 1, yellow_color, 1)

            # 카운트를 초기화합니다. 다시 첫번째 클릭부터 시작합니다.            
            count = 0     
       
    # 이미지를 화면에 출력합니다.
    cv2.imshow('result', img)

    # ESC 키누르면 종료하도록합니다.
    if cv2.waitKey(1) & 0xFF == esc_key:
        break


# 윈도우 자원을 해제합니다.
cv2.destroyAllWindows()



반응형