首先通过鼠标操作在图片上随机点两个点,创建一条直线。然后点第三个点,该点到直线的距离就出来了。
由于鼠标点击有误差,所以测的距离有误差,还请大佬指点!

#include "opencv2/opencv.hpp"
#include <iostream>
#include <math.h>using namespace cv;
using namespace std;//定义一个计算两点距离的函数
double getDistance(CvPoint pointO, CvPoint pointA)
{double distance;distance = powf((pointO.x - pointA.x), 2) + powf((pointO.y - pointA.y), 2);distance = sqrtf(distance);return distance;
}//定义一个将长整形转换成字符串型的函数
string convertToString(long d)
{ostringstream os;if (os << d)return os.str();return "invalid conversion";
}//定义全局变量
static Mat img_src;static Point point1 = Point(0, 0);//第一个点(x1,y1)
static Point point2 = Point(0, 0);//第二个点(x2,y2)
static Point point3 = Point(0, 0);//第三个点(x3,y3)
static Point point4;//第四个点(x4,y4)
static Point point5;static Point mouse_dot;
static string window_name = "image";//定义鼠标事件函数
static void onMouse(int event, int x, int y, int, void*)
{if (CV_EVENT_LBUTTONDOWN == event)//鼠标左键按下{mouse_dot = Point(x, y);//接收按下点的坐标并赋值if (point1.x == 0 && point1.y == 0)//接收第一个点{point1 = mouse_dot;point5 = mouse_dot;}else if (point2.x == 0 && point2.y == 0)//接收第二个点{point2 = mouse_dot;point5 = mouse_dot;}else if (point3.x == 0 && point3.y == 0)//接收第三个点{point3 = mouse_dot;point5 = mouse_dot;}}else if (CV_EVENT_LBUTTONUP == event)//鼠标左键松开{circle(img_src, point5, 2, Scalar(255, 0, 0), 2);//用小圆标志按下的点imshow("output", img_src);//并将小圆点显示在图片上//如果在图片上点击完3个点后,将进行下面的操作if (point3.x != 0 && point3.y != 0){//计算点point3到直线的距离,并求出直线上的点point4,连接point3和point4,并输出两点距离//建立直线方程Ax+By+C=0-->(y2-y1)*x+(x1-x2)*y+(x2*y1-x1*y2)=0long A = point2.y - point1.y;long B = point1.x - point2.x;long C = point2.x*point1.y - point1.x*point2.y;long a = A*A;long b = B*B;//直线距离公式D=|A*x3+B*y3+C|/sqrt(A^2+B^2)long w = (A*point3.x + B*point3.y + C);if (w < 0) w = 0 - w;//取绝对值long D = long(w / sqrt(a + b));//利用公式x4=(x3*B^2-AB*y3-AC)/(A^2+B^2)和A*x4+B*y4+C=0求出直线上的点point4.x = int((b*point3.x - A*B*point3.y - A*C) / (a + b));if (B == 0) point4.y = point3.y;//排除分母为零的情况else point4.y = int((-C - A*point4.x) / B);circle(img_src, point4, 2, Scalar(255, 0, 0), 2);line(img_src, point3, point4, Scalar(255, 255, 255), 1, 8);//确定文字在图片上显示的位置,并输出文字int wedth = (point3.x + point4.x) / 2 ;int height = (point3.y + point4.y) / 2-10;string length = convertToString(D);putText(img_src, length, Point(wedth, height), CV_FONT_HERSHEY_SIMPLEX, 0.4, Scalar(255, 255, 255), 1, 8);//把所有的点归零,才能进行下次操作point1 = Point(0, 0);point2 = Point(0, 0);point3 = Point(0, 0);point4 = Point(0, 0);imshow("output", img_src);//刷新图片waitKey(0);}//点击了两个点后,用直线连接两个点else if (point2.x != 0 && point2.y != 0){line(img_src, point1, point2, Scalar(255, 255, 255), 1, 8);imshow("output", img_src);//刷新图片}}
}int main(int argc, char** argv)
{img_src = imread("zheng_lingjian2.png");if (!img_src.data){cout << "the image isn't loaded..." << endl;return -1;}namedWindow(window_name, CV_WINDOW_AUTOSIZE);setMouseCallback(window_name, onMouse, 0);//执行鼠标操作,且只能在image窗口进行鼠标点击while (true){imshow(window_name, img_src);int c = waitKey(0);//通过Esc键退出程序if ((c & 255) == 27){ destroyAllWindows();cout << "Exiting ...\n";break;}}return 0;
}

使用opencv测量点到线的距离相关推荐

  1. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  2. java点到直线的投影点到经纬度_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...

    12分高考答题必刷题型,"空间向量分析点到线的距离问题" 立体几何大题 立体几何在各地高考中,基本都占据20分以上的比例,在解答方法上,小题技巧相对比较丰富,但大题解答上有明显的规 ...

  3. 点到直线的投影公式_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...

    12分高考答题必刷题型,"空间向量分析点到线的距离问题" 立体几何大题 立体几何在各地高考中,基本都占据20分以上的比例,在解答方法上,小题技巧相对比较丰富,但大题解答上有明显的规 ...

  4. 三维空间:点到线的距离,点到面上的投影,直线在平面上的投影直线方程(平面束)

    你好哦,这里是云切月斩(Echo_Fish),本文章如果能加深你对于高等数学知识点的理解,那么我将不胜荣幸!如果本文章存在错误请不吝赐教! 一.点到线的距离(已知一个点和直线的一般式) 已知点P(3, ...

  5. 利用数学公式计算点到线的距离

    作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 场景: 数学原理和公式详解: 已知直线上两点求直线的一般式方程: 点到线的距离公 ...

  6. 点到直线的距离c语言程序,计算几何算法2. 关于线和点到线的距离(二维和三维)...

    关于直线 直线方程 点到直线的距离 用两点表示的直线 2d隐式表示的直线的情形 参数方程表示的直线 一个点到射线或线段的距离 代码实现 距离计算是计算机图形学和计算几何的基本问题,而且有很多关于这方面 ...

  7. matlab中 点到线的距离,用matlab求解点到直线的距离

    满意答案 cith4gbai 2013.12.31 采纳率:59%    等级:12 已帮助:46219人 用matlab求解点到直线的距离,可自定义函数,方法如下: 先用直线上的一点和代表直线方向的 ...

  8. arctanx麦克劳林公式推导过程_点到线的距离公式推导过程

    本书的第二章主要写如何让阅读融入生活,形成一种新的生活规律? 第一步,时间地点的选择 每天选择同一时间.同一地点,读上10分钟.但是我个人还是觉得20分钟相对合适,虽然20分钟也不长,但对于一个新习惯 ...

  9. 点到面距离公式向量法_点到线或面的距离公式

    我们知道高中解析几何或立体几何题中时常需要知道点到线的距离或点到面的距离.下面我们给出这两个公式以及它们的巧妙证明. 点到线的距离 已知直线 的方程为 ,平面上任意一点 到该直线的距离 的公式为: 证 ...

  10. Android 高德地图计算 Circle 计算上下左右四个点经纬度,Circle和Polygon是否全部包含,计算地图中点到线的最短距离

    /*** 假设地球为一半径为R的表面光滑圆球体,* 表面上同一经线圈上相差1"两点间的距离为 2πR/360/3600* 表面上同一纬线圈上相差1"两点间的距离为 2πR×cos( ...

最新文章

  1. 买了一本老镇的swift语言实战晋级
  2. labview嵌入c代码_Raspberry pi 4B+LabVIEW_2020amp;NXG部署WebApp
  3. 用了Elasticsearch后,查询起飞了!
  4. 10亿 !清华大学又获巨额捐赠
  5. 使用map的find头文件_C++ map的基本操作和使用
  6. pgp 私钥需要什么样的保护措施_网络货运作为物流行业的掌舵者企业申报需要满足的条件重点有哪些...
  7. 如何用计算机寒假计划表,如何制定寒假学习计划表
  8. 换ip 电脑ip切换 ip修改 支持xp win7 win10
  9. Android release apk 签名流程
  10. AI教育甚嚣尘上,“松鼠”、“小猿”们能否重塑教育形态?
  11. 数据中心的铜缆布线活力无限不过时
  12. java取字符串首字母_java 获取中文字符的首字母
  13. 查询大全,肯定有你需要的!
  14. 一周消息树:推低端iPhone,将会是苹果必然之举
  15. 关于华为HS8145V 进入华为界面后 再刷回电信界面
  16. 域名防劫持 稳定快速。
  17. 接上一篇Trao文本行数及省略号问题
  18. 【Pycharm教程】了解 PyCharm Python 控制台
  19. C++语言程序设计第五版 - 郑莉(第六章课后习题)
  20. openamp RPU-APU双核间通信 建立多个通道

热门文章

  1. Python如何实现图片显示
  2. iphonex时间显示蓝色_iphonex时间显示蓝色
  3. python图像手绘效果_python 3.6实现图像的手绘效果
  4. 流水作业调度 johnson法则
  5. android 动态表情包,动态表情包下载免费
  6. Markdown:VS Code中预览markdown的快捷键和markdown的简单语法
  7. 纯碱增仓10%上涨,PTA认沽大涨10倍,玻璃-纯碱继续下探2022.6.29
  8. aria2linux安装教程,Ubuntu 安装下载工具 Aria2
  9. 数据库表中的数据显示在网页上
  10. 打印表格留标题怎么设置_WPS怎么设置打印表格每页都有标题?