OpenCV中距离公式

一、各类距离公式总结

常见距离公式

     欧氏距离

    曼哈顿距离(L1)‌:

     切比雪夫距离(Chessboard)‌:

1、点与点距离(欧氏距离)
  1. 二维空间
    设两点坐标为 P1(x1,y1)、P2(x2,y2),其距离为:

  2. 三维空间
    设两点坐标为 P1(x1,y1,z1)、P2(x2,y2,z2),距离公式为:

2、点与直线距离
  1. 二维直线
    已知直线方程 Ax+By+C=0,点 P(x0,y0)P(x0​,y0​),距离公式为:

  2. 三维直线
    若直线由参数方程表示,可通过向量叉乘计算。设直线上一点 M,方向向量 ,点 P 到直线的距离为:

3、点与平面距离

三维空间
已知平面方程 Ax+By+Cz+D=0Ax+By+Cz+D=0,点 P(x0,y0,z0)P(x0​,y0​,z0​),距离公式为:

4、点与不规则曲面距离

不规则曲面通常无统一解析式,需采用以下方法近似计算:

  1. ‌数值优化‌:通过迭代算法(如梯度下降)寻找曲面上与点距离最小的位置‌。
  2. ‌参数化投影‌:若曲面可参数化,将点投影至参数空间求解‌。
  3. ‌离散逼近‌:将曲面离散为网格,计算点到各网格面的最小距离‌。

二、OpenCV距离公式

1. 点与点之间的距离

在二维或三维空间中,计算两个点之间的欧氏距离是最直接的。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>double distancePointToPoint(const cv::Point& p1, const cv::Point& p2) {return std::sqrt(std::pow(p2.x - p1.x, 2) + std::pow(p2.y - p1.y, 2));
}int main() {cv::Point p1(1, 2);cv::Point p2(4, 6);// 方法1:直接利用公式计算std::cout << "Distance: " << distancePointToPoint(p1, p2) << std::endl;// 方法2:使用cv::norm函数  欧氏距离
double distance = cv::norm(p2-p1, cv::NORM_L2);//方法2:使用cv::norm函数  曼哈顿距离
double l1_distance = cv::norm(pt2 - pt1, cv::NORM_L1);//方法2:使用cv::norm函数  切比雪夫距离
double chessboard_distance = cv::norm(pt2 - pt1, cv::NORM_INF);return 0;
}

2. 点到直线的距离

点到直线的距离可以通过多种方式计算,这里介绍一种常见的方法,使用点到直线的垂直距离公式。假设直线由两点确定(A和B),或者通过一个点和斜率(y = mx + c)。

使用两点定义直线:
double distancePointToLine(const cv::Point& p, const cv::Point& A, const cv::Point& B) {double numerator = std::abs((B.y - A.y) * p.x - (B.x - A.x) * p.y + B.x * A.y - A.x * B.y);double denominator = std::sqrt(std::pow(B.y - A.y, 2) + std::pow(B.x - A.x, 2));return numerator / denominator;
}
使用点和斜率定义直线:
double distancePointToLine(const cv::Point& p, double m, double c) { // y = mx + creturn std::abs(m * p.x - p.y + c) / std::sqrt(m * m + 1);
}

3. 点到面的距离

点到面的距离计算涉及到三维空间中的点、直线和平面。在三维空间中,一个平面可以通过一个点和法向量来定义。点到平面的距离可以通过以下公式计算:

double distancePointToPlane(const cv::Point3f& p, const cv::Point3f& planePoint, const cv::Vec3f& normal) {return std::abs(normal.dot(p - planePoint)); // 使用OpenCV的Vec3f的dot()方法计算点积并取绝对值
}

示例代码:

int main() {cv::Point p(3, 3);cv::Point A(1, 1), B(4, 4); // 两点定义直线ABstd::cout << "Distance from point to line: " << distancePointToLine(p, A, B) << std::endl;cv::Point3f point3d(2, 2, 2); // 三维点cv::Point3f planePoint(0, 0, 0); // 平面上的一点cv::Vec3f normal(0, 0, 1); // 法向量,例如z轴方向上的单位向量 (0, 0, 1)std::cout << "Distance from point to plane: " << distancePointToPlane(point3d, planePoint, normal) << std::endl;return 0;
}

4.图像的距离变换(Distance Transform)

用于计算二值图像中每个像素到最近背景像素的距离。OpenCV支持多种距离类型:

  • DIST_L1:曼哈顿距离(快速计算)
  • DIST_L2:欧氏距离(精确计算)
  • DIST_C:棋盘距离(切比雪夫距离)
    cv::Mat binaryImage; // 输入二值图像(0表示背景,非0表示前景)
    cv::Mat distImage;cv::distanceTransform(binaryImage, distImage, cv::DIST_L2, 5);

5. 轮廓/形状之间的距离

使用 cv::matchShapes() 计算两个形状的相似性(基于Hu矩):

double similarity = cv::matchShapes(contour1, contour2, cv::CONTOURS_MATCH_I1, 0);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js 模板语法全解析:从基础到实战应用

引言 在 Vue.js 的开发体系中&#xff0c;模板语法是构建用户界面的核心要素&#xff0c;它让开发者能够高效地将数据与 DOM 进行绑定&#xff0c;实现动态交互效果。通过对《Vue.js 快速入门实战》中关于 Vue 项目部署章节&#xff08;实际围绕 Vue 模板语法展开&#xff09;…

论文笔记(七十三)Gemini Robotics: Bringing AI into the Physical World

Gemini Robotics: Bringing AI into the Physical World 文章概括1. 引言2. Gemini 2.0的具身推理2.1. 具身推理问答&#xff08;ERQA&#xff09;基准测试2.2. Gemini 2.0的具身推理能力2.3. Gemini 2.0支持零样本和少样本机器人控制 3. 使用 Gemini Robotics 执行机器人动作3…

centos7搭建postgresql12主从

主从搭建 192.168.159.101 node1 主库&#xff08;读写&#xff09; 192.168.159.102 node2 备库&#xff08;只读&#xff09; 两台机器首先安装postgrsql 主库 postgres用户操作&#xff1a; 修改postgresql.conf # 在文件中修改(此配置仅用于远程访问, 流复制后续还有额外…

嵌入式基础知识学习:SPI通信协议是什么?

SPI&#xff08;Serial Peripheral Interface&#xff09;是串行外设接口的缩写&#xff0c;是一种广泛应用于嵌入式系统的高速同步串行通信协议&#xff0c;由摩托罗拉公司于20世纪80年代提出。以下是其核心要点&#xff1a; 一、SPI的核心定义与特点 基本特性 全双工同步通信…

996引擎-接口测试:背包

996引擎-接口测试:背包 背包测试NPC参考资料背包测试NPC CONSTANT = require("Envir/QuestDiary/constant/CONSTANT.lua"); MsgUtil = require("Envir/QuestDiary/utils/996/MsgUtil.lua");

vulnhub靶场之【hack-me-please靶机】

前言 靶机&#xff1a;billu_b0x2靶机&#xff0c;IP地址为192.168.10.8 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 靶机和攻击机都采用VMware虚拟机&#xff0c;都采用桥接网卡模式 文章涉及的靶机及工具&#xff0c;都可以自行访问官网或者项目地址进行获取&…

机器学习——KNN模型评价

一、主要函数 sklearn.metrics.accuracy_score() 是 scikit-learn 中用于计算分类模型准确率的函数&#xff0c;适用于评估分类任务的整体性能。 1、核心功能 作用&#xff1a;计算模型预测的准确率&#xff0c;即正确分类的样本数占总样本数的比例。公式&#xff1a;Accurac…

美国国家数据浮标中心(NDBC)

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…

Qt调用Miniconda的python方法

1、 Win 64环境下载及安装 Miniconda 首先下载Windows 版Miniconda&#xff0c;https://docs.conda.io/en/latest/miniconda.html或 https://repo.anaconda.com/miniconda/ 安装界面及选择如下图所示&#xff1a; 安装完python3.12版报错如下。 说明&#xff1a;python3.11版…

Unity 与 JavaScript 的通信交互:实现跨平台的双向通信

前言 在现代游戏开发和 Web 应用中&#xff0c;Unity 和 JavaScript 的结合越来越常见。Unity 是一个强大的跨平台游戏引擎&#xff0c;而 JavaScript 是 Web 开发的核心技术之一。通过 Unity 和 JavaScript 的通信交互&#xff0c;开发者可以实现从 Unity 到 Web 页面的功能扩…

汽车免拆诊断案例 | 2024 款路虎发现运动版车无法正常识别智能钥匙

故障现象  一辆2024款路虎发现运动版车&#xff0c;搭载2.0 L发动机&#xff0c;累计行驶里程约为5 000 km。车主反映&#xff0c;使用遥控器无法解锁车门&#xff0c;随后使用机械钥匙打开车门&#xff0c;踩下制动踏板&#xff0c;按压起动按钮&#xff0c;仪表盘提示“将智…

跟着StatQuest学知识06-CNN进行图像分类

目录 一、CNN特点 二、CNN应用于图像分类 &#xff08;一&#xff09;使用过滤器 &#xff08;二&#xff09;通过ReLU激活函数 &#xff08;三&#xff09;应用新的滤波器&#xff08;池化&#xff09; &#xff08;四&#xff09;输入 &#xff08;五&#xff09;输出…

OpenHarmony 开源鸿蒙北向开发——linux使用make交叉编译第三方库

这几天搞鸿蒙&#xff0c;需要编译一些第三方库到鸿蒙系统使用。 头疼死了&#xff0c;搞了一个多星期总算搞定了。 开贴记坑。 一、SDK下载 1.下载 在linux下使用命令 wget https://cidownload.openharmony.cn/version/Master_Version/OpenHarmony_5.1.0.54/20250313_02…

Selenium Web UI自动化测试:从入门到实战

引言 在当今快速迭代的软件开发周期中&#xff0c;自动化测试已成为保障产品质量、提升测试效率的核心手段之一。而针对Web应用的UI自动化测试&#xff0c;Selenium作为最流行的开源工具之一&#xff0c;凭借其跨浏览器、多语言支持&#xff08;Python、Java、C#等&#xff09…

Java 大视界 -- Java 大数据中的数据隐私保护技术在多方数据协作中的应用(147)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

编程考古-安德斯·海尔斯伯格(Anders Hejlsberg)回答离开Borland的原因

安德斯海尔斯伯格&#xff08;Anders Hejlsberg&#xff09;是著名的编程语言和工具开发者&#xff0c;曾主导开发了 Turbo Pascal、Delphi&#xff08;Borland 时期&#xff09;&#xff0c;以及加入微软后参与的 C# 和 TypeScript。关于他离开 Borland 的原因&#xff0c;可以…

西门子仿真实例位置

C:\Users\san\Documents\Siemens\Simatic\Simulation\Runtime\Persistence S7-PLCSIM Advanced V3.0 可以打开文件&#xff0c;删除重建

【数据库系统原理】Ch7 数据库应用设计与开发实例

目录 大纲7.1 需求描述与分析7.2 系统设计7.3 系统实现7.4 系统测试与维护 习题真题2024-102024-042023-102023-042022-10 大纲 7.1 需求描述与分析 熟悉需求描述与分析的方法,达到"领会"层次。 7.2 系统设计 熟悉根据需求的描述划分系统的功能模块,能够进行初步…

使用 Python 的turtle库绘制精美图形

在 Python 编程的世界里&#xff0c;turtle库是一个非常有趣且实用的工具&#xff0c;它为初学者和有经验的开发者提供了一个简单而直观的方式来进行图形绘制。本文将详细讲解如何使用turtle库绘制不同的图形&#xff0c;包括六边形、一个特定的多边形&#xff0c;以及一个由线…

基于linux平台的C语言入门教程(5)基本数据类型

文章目录 1. 什么是数据类型&#xff1f;2. C 语言的基本数据类型3. 数据类型的存储大小4. 示例代码代码解析&#xff1a;输出结果&#xff1a; 5. 常见问题问题 1&#xff1a;float 和 double 的区别是什么&#xff1f;问题 2&#xff1a;unsigned 类型可以存储负数吗&#xf…