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.pswp.cn/diannao/74210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74210.shtml
英文地址,請注明出處:http://en.pswp.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…