코드 및 이미지 : https://github.com/Seokii/Study_OpenCV
두 점의 좌표를 통해 a, b 계산
y = ax + b 꼴의 직선의 방정식에서 (x1, y1), (x2, y2)의 두 점 좌표가 주어졌을 때 a, b 값을 구하는 식은 다음과 같습니다.
def cal_ab(x1, y1, x2, y2):
# y = ax + b
a = (y2 - y1)/(x2 - x1)
b = (x2*y1 - x1*y2)/(x2 - x1)
return a,b
a = (y2-y1)/(x2-x1)
b = (x2*y1 - x1*y2)/(x2 - x1)
식을 이용해 a와 b 값을 반환하는 함수를 구현해 OpenCV에서 직선을 그려보도록 하겠습니다.
주피터 노트북
import cv2
import numpy as np
- OpenCV와 numpy를 사용해 실습을 진행했습니다.
img_size = (500,800,3)
img = np.ones(img_size) * 255
x1, y1, x2, y2 = 200, 200, 600, 300
R,G,B = (0,0,255), (0,255,0), (255,0,0)
- numpy를 사용해 지정한 크기 및 채널을 적용하여 흰색 이미지를 생성했습니다.
- x1, y1, x2, y2의 임의의 좌표를 설정하고 R,G,B에 해당하는 색의 값을 지정했습니다.
cv2.circle(img, (x1, y1), 7, G, -1, cv2.LINE_AA)
cv2.circle(img, (x2, y2), 7, G, -1, cv2.LINE_AA)
cv2.line(img, (x1, y1), (x2, y2), R, 3, cv2.LINE_AA)
cv2.imshow("infinite line", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 설정한 좌표를 각각의 녹색 점으로, 그리고 두 점을 잇는 선분을 그렸습니다.
- 도형 그리기 실습은 아래의 링크 참고 바랍니다.
03. 간단한 도형 그리기(선, 사각형, 원) [ https://seokii.tistory.com/6 ]
def cal_ab(x1, y1, x2, y2):
# y = ax + b
a = (y2 - y1)/(x2 - x1)
b = (x2*y1 - x1*y2)/(x2 - x1)
return a,b
a,b = cal_ab(x1, y1, x2, y2)
- 앞서 설명한 함수를 정의하고 설정한 좌표 값을 입력해 a, b 값을 계산합니다.
- 이미지의 크기와 a, b 값에 대한 출력 결과입니다.
- 해당 값을 이용해 무한한 직선을 그려보도록 하겠습니다.
img = np.ones(img_size) * 255
cv2.circle(img, (x1, y1), 7, G, -1, cv2.LINE_AA)
cv2.circle(img, (x2, y2), 7, G, -1, cv2.LINE_AA)
# y=ax+b의 식을 사용해 직선을 그려보자!
cv2.line(img, (0, int(b)), (int(img.shape[1]), int(a*img.shape[1]+b)), R, 3, cv2.LINE_AA)
cv2.imshow("infinite line", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 두 점의 좌표를 똑같이 표시 후, x1 = 0일 때의 y값(=b)과 x2 = img.shape[1] (=800) 일 때의 y값 (= a*800 + b)을 통해 직선을 그려주었습니다. 결과는 아래와 같습니다.
활용 예시
- Yolov5를 통해 사람을 객체 탐지하여 좌표값을 이용해 직선을 그려주었습니다.
- 해당 직선에 충돌하면 탐지한 어류(갈치)가 몇 마리 잡혔는지 카운팅 하는 알고리즘을 설계할 수 있습니다.
- 예시 외에도 영상 처리와 관련된 다양한 충돌, 구역 분할 등의 알고리즘에 적용할 수 있을 것이라 생각합니다.
댓글