머신러닝 & 딥러닝/컴퓨터 비전

[OpenCV with Python] - 16. 두 점의 좌표를 이용해 무한한 직선 그리기

by seokii 2022. 7. 27.
728x90
반응형

코드 및 이미지 : https://github.com/Seokii/Study_OpenCV

 

GitHub - Seokii/Study_OpenCV: study about OpenCV

study about OpenCV. Contribute to Seokii/Study_OpenCV development by creating an account on GitHub.

github.com

 

두 점의 좌표를 통해 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를 통해 사람을 객체 탐지하여 좌표값을 이용해 직선을 그려주었습니다.

- 해당 직선에 충돌하면 탐지한 어류(갈치)가 몇 마리 잡혔는지 카운팅 하는 알고리즘을 설계할 수 있습니다.

 

- 예시 외에도 영상 처리와 관련된 다양한 충돌, 구역 분할 등의 알고리즘에 적용할 수 있을 것이라 생각합니다.

 

 

728x90
반응형

댓글