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() |
반응형