已知图像中线段的两个点,求另外一个点到这个点的垂足。
一、垂足公式
- 已知直线一般式方程时:
设已知直线外一点坐标为 ( x 0 , y 0 ) (x0,y0) (x0,y0),垂足坐标为 ( x , y ) (x,y) (x,y),因为垂线与直线垂直,垂线斜率为 k k k的负倒数,则可得方程:
A x + B y + C = 0 ( y − y 0 ) / ( x − x 0 ) = B / A ; Ax + By + C = 0\\ (y - y0) / (x - x0) = B / A; Ax+By+C=0(y−y0)/(x−x0)=B/A;
解方程可得垂足坐标为
x = ( B ∗ B ∗ x 0 − A ∗ B ∗ y 0 − A ∗ C ) / ( A ∗ A + B ∗ B ) y = ( − A ∗ B ∗ x 0 + A ∗ A ∗ y 0 − B ∗ C ) / ( A ∗ A + B ∗ B ) x = ( B*B*x0 - A*B*y0 - A*C ) / ( A*A + B*B )\\ y = ( -A*B*x0 + A*A*y0 - B*C ) / ( A*A + B*B ) x=(B∗B∗x0−A∗B∗y0−A∗C)/(A∗A+B∗B)y=(−A∗B∗x0+A∗A∗y0−B∗C)/(A∗A+B∗B)
- 直线的斜截式方程:
y = k x + b = − ( A / B ) y − ( C / B ) y = kx + b =- (A/B)y - (C/B) y=kx+b=−(A/B)y−(C/B)
计算得出 A 、 B 、 C A、B、C A、B、C
A = k ; B = − 1.0 ; C = p n t S a r t . y − k ∗ p n t S a r t . x A = k;\\ B = -1.0;\\ C = pntSart.y - k * pntSart.x A=k;B=−1.0;C=pntSart.y−k∗pntSart.x
再将以上 A 、 B 、 C A、B、C A、B、C分别代入垂足公式即可
二、C++代码
#include <iostream> #include "opencv2/opencv.hpp" void FindFoot(cv::Point2f pntSart, cv::Point2f pntEnd, cv::Point2f pA, cv::Point2f &pFoot) {
float k = 0.0; if(pntSart.x == pntEnd.x) {
pFoot.x = pntSart.x; pFoot.y = pA.y; return; } k = (pntEnd.y - pntSart.y) * 1.0 / (pntEnd.x - pntSart.x); float A = k; float B = -1.0; float C = pntSart.y - k * pntSart.x; pFoot.x = (B * B * pA.x -A * B * pA.y-A * C) / (A * A + B * B); pFoot.y = (A * A * pA.y - A * B * pA.x-B * C) / (A * A + B * B); } int main() {
cv::Mat matBgrImg = cv::Mat(300, 300, CV_8UC3, cv::Scalar(0,0,0)); std::cout << matBgrImg.cols << std::endl; cv::Point2f p1(100, 100); cv::Point2f p2(200, 200); cv::Point2f pA(100, 200); cv::Point2f pFoot; FindFoot(p1, p2, pA, pFoot); std::cout << pFoot.x << " " << pFoot.y << std::endl; cv::line(matBgrImg, p1, p2, cv::Scalar(0, 255, 255, 0), 2); cv::line(matBgrImg, pA, pFoot, cv::Scalar(255, 0, 0, 0), 2); cv::imshow("name", matBgrImg); cv::waitKey(0); std::cout << "Hello, World!" << std::endl; return 0; }
讯享网
显示如下:


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/129307.html