[OpenCV] Projection 선분 위 수선의 발
Computer Vision 2026. 3. 19. 10:18 |반응형
두 점으로 이루어지는 선분과 한 점 사이의 거리 및 수선의 발을 찾아보자.
#include <opencv2/opencv.hpp>
#include <iostream>
float distPointToSegment(cv::Point2f p, cv::Point2f a, cv::Point2f b) {
float l2 = std::powf(a.x - b.x, 2) + std::powf(a.y - b.y, 2); // 선분의 길이 제곱
if (l2 == 0.0f) // a와 b가 같은 경우
return std::sqrt(std::powf(p.x - a.x, 2) + std::powf(p.y - a.y, 2)); // 점과 a 사이 거리
// 선분 위로 점 p의 사영(Projection) 위치 t 계산(투영된 지점의 비율)
// t = [(p-a) dot (b-a)] / |b-a|^2
float t = ((p.x - a.x) * (b.x - a.x) + (p.y - a.y) * (b.y - a.y)) / l2;
// t가 0~1 사이면 선분 위(0이면 a, 1이면 b), 그렇지 않으면 선분 밖
// 0보다 작으면 a쪽, 1보다 크면 b쪽
if (t < 0.0f)
return std::sqrt(std::powf(p.x - a.x, 2) + std::powf(p.y - a.y, 2));
if (t > 1.0f)
return std::sqrt(std::powf(p.x - b.x, 2) + std::powf(p.y - b.y, 2));
// 선분 위에 사영된 점 위치 계산
cv::Point2f projection = a + t * (b - a);
std::cout << "Projection Point: (" << projection.x << ", " << projection.y << ")" << std::endl;
// 점 p와 사영된 점 사이의 거리 계산
return std::sqrt(std::powf(p.x - projection.x, 2) + std::powf(p.y - projection.y, 2));
}
int main() {
cv::Point2f p(100, 0); // 점 p
cv::Point2f a(0, 0); // 선분 시작점 a
cv::Point2f b(100, 100); // 선분 끝점 b
float distance = distPointToSegment(p, a, b);
std::cout << "Point to Segment Distance: " << distance << std::endl;
return 0;
}

반응형
'Computer Vision' 카테고리의 다른 글
| [OpenCV] 빠르게 움직이는 대상의 영상을 깨끗하게 가져오기 (0) | 2026.03.21 |
|---|---|
| [OpenCV] Polygon Mask 폴리곤 마스크 3 (0) | 2026.03.19 |
| [OpenCV] Pixels on the line 라인 위의 모든 점 찾기 (0) | 2026.03.19 |
| [OpenCV] Tesseract OCR C++ 문자, 숫자 인식 (0) | 2026.03.15 |
| [OpenCV] Object Tracking 객체 추적 (0) | 2026.03.13 |
