opencv projectPoints函數 computeCorrespondEpilines函數 undistortPoints函數

opencv projectPoints函數

cv::projectPoints 是 OpenCV 中用于將三維點投影到二維圖像平面的函數。它通常用于計算在相機坐標系下的三維點在圖像坐標系中的位置,考慮了相機的內參和外參。

函數原型

void cv::projectPoints(InputArray objectPoints,InputArray rvec,InputArray tvec,InputArray cameraMatrix,InputArray distCoeffs,OutputArray imagePoints,OutputArray jacobian = noArray()
);

參數說明

  • objectPoints: 輸入的三維點集合,通常是一個 nx3 的矩陣,表示 n 個三維點。
  • rvec: 旋轉向量,描述相機的旋轉。可以使用 Rodrigues 變換來從旋轉矩陣轉換為旋轉向量。
  • tvec: 平移向量,描述相機的位置。
  • cameraMatrix: 相機內參矩陣,包含焦距和主點位置。
  • distCoeffs: 相機的畸變系數,通常是一個長度為 5 或 8 的向量。
  • imagePoints: 輸出的二維點集合,函數將計算的圖像坐標保存在這個參數中。
  • jacobian: 可選的輸出參數,保存雅可比矩陣。

使用示例

以下是一個簡單的示例,展示如何使用 cv::projectPoints 函數:

#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 定義三維點std::vector<cv::Point3f> objectPoints = {{0.0f, 0.0f, 0.0f},{1.0f, 0.0f, 0.0f},{0.0f, 1.0f, 0.0f},{1.0f, 1.0f, 0.0f}};// 定義相機內參矩陣cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << 800, 0, 320,0, 800, 240,0, 0, 1);// 定義相機畸變系數cv::Mat distCoeffs = (cv::Mat_<double>(5, 1) << 0, 0, 0, 0, 0);// 定義旋轉向量和位移向量cv::Mat rvec = (cv::Mat_<double>(3, 1) << 0, 0, 0); // 無旋轉cv::Mat tvec = (cv::Mat_<double>(3, 1) << 0, 0, 5); // 向前移動5個單位// 輸出二維點std::vector<cv::Point2f> imagePoints;// 使用 projectPoints 函數cv::projectPoints(objectPoints, rvec, tvec, cameraMatrix, distCoeffs, imagePoints);// 輸出結果for (size_t i = 0; i < imagePoints.size(); ++i) {std::cout << "3D Point: " << objectPoints[i] << " -> 2D Point: " << imagePoints[i] << std::endl;}return 0;
}

代碼說明

  1. 定義三維點:創建一個包含多個三維點的向量。
  2. 設置相機內參和畸變系數:定義一個相機內參矩陣和畸變系數。
  3. 定義旋轉和位移向量:設置相機的旋轉和位移。
  4. 調用 projectPoints:將三維點投影到圖像平面,計算出對應的二維點。
  5. 輸出結果:打印出每個三維點及其對應的二維投影。

總結

cv::projectPoints 是一個強大的工具,可以用于各種計算機視覺應用,如相機標定、三維重建等。通過正確設置相機參數和三維點,可以方便地將三維信息映射到二維圖像中。

computeCorrespondEpilines函數

cv::computeCorrespondEpilines 函數在 OpenCV 中用于計算對應點的極線。這在立體視覺中非常重要,因為它可以幫助我們確定一對立體圖像中對應點的匹配關系。

函數原型

void cv::computeCorrespondEpilines(InputArray points,int mode,InputArray F,OutputArray lines
);

參數說明

  • points: 輸入的點集,可以是 2D 點的集合。對于單個圖像中的點,格式應為 (N \times 1 \times 2) 或 (N \times 2)。
  • mode: 模式參數,指定輸入點的來源。可以是以下值:
    • 1: 表示輸入點來自第一幅圖像。
    • 2: 表示輸入點來自第二幅圖像。
  • F: 基本矩陣(Fundamental Matrix),用于描述兩個相機視圖之間的幾何關系。
  • lines: 輸出的極線,每個點對應一條極線。格式是 (N \times 1 \times 3) 或 (N \times 3)。

示例代碼

以下是一個使用 computeCorrespondEpilines 的示例:

#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 定義一組點,假設這些點來自第一幅圖像std::vector<cv::Point2f> points1 = { {100, 150}, {200, 250}, {300, 350} };// 基本矩陣 F,假設已知cv::Mat F = (cv::Mat_<double>(3, 3) << 0, 0, -0.1, 0, 0, -0.2, 0.1, 0.2, 1);// 計算對應的極線cv::Mat lines1;cv::computeCorrespondEpilines(points1, 1, F, lines1);// 打印極線for (int i = 0; i < lines1.rows; ++i) {double a = lines1.at<double>(i, 0);double b = lines1.at<double>(i, 1);double c = lines1.at<double>(i, 2);std::cout << "Line " << i + 1 << ": " << a << "x + " << b << "y + " << c << " = 0" << std::endl;}return 0;
}

代碼解析

  1. 輸入點: 定義一組點,這些點通常是從第一幅圖像中提取的。
  2. 基本矩陣: 定義已知的基本矩陣 (F)。
  3. 計算極線: 使用 computeCorrespondEpilines 函數計算極線,將結果存儲在 lines1 中。
  4. 輸出極線: 打印計算出的極線方程。

注意事項

  • 基本矩陣: 基本矩陣 (F) 可以通過立體標定過程獲得,通常需要在相機標定和特征匹配之后計算。
  • 點的格式: 確保輸入點的格式正確,符合函數要求。
  • 模式參數: 根據輸入點的來源設置適當的模式參數(1 或 2)。

總結

computeCorrespondEpilines 是一個非常有用的函數,它可以幫助在立體視覺中確定點對應的極線,從而在后續的匹配和重建過程中發揮重要作用。通過正確使用基本矩陣和輸入點,可以有效地計算出所需的極線。

極線

在立體視覺和計算機視覺中,極線(epipolar lines)是一個重要的概念,主要用于描述兩個相機視圖之間的幾何關系。以下是極線的含義和作用:

極線的定義

  1. 極點和極線:

    • 在立體視覺中,兩個相機的視點分別稱為左視點右視點。如果你在左視圖中選擇一個點,則在右視圖中,該點的對應點必定位于一條特定的直線上,這條直線稱為極線
    • 對于左視圖中的每個點,都有一條與之對應的極線在右視圖中;反之亦然。
  2. 極線的幾何意義:

    • 極線是由相機的視點(即相機的光心)和對應點在另一幅圖像中的位置共同決定的。極線的方程可以用基本矩陣(Fundamental Matrix)來表示。

極線的作用

  1. 簡化匹配:

    • 由于對應點必須位于極線上的特性,極線大大簡化了點匹配的過程。在進行立體匹配時,只需在極線上查找可能的對應點,而不需要在整幅圖像中搜索,從而提高計算效率。
  2. 約束條件:

    • 極線提供了幾何約束,允許我們在立體圖像中進行更精確的點匹配。這種約束有助于減少誤匹配的可能性,提高深度估計的準確性。
  3. 三維重建:

    • 通過找到圖像中的對應點并計算其極線,可以實現三維重建。通過三角測量,利用兩個相機的視點和對應點的位置,可以計算出物體在三維空間中的位置。

總結

在立體視覺中,極線是相機視圖之間的幾何關系的關鍵,它簡化了對應點的匹配問題,提供了約束條件,并在三維重建中發揮重要作用。理解極線的概念是進行立體視覺分析和應用的基礎。

opencv undistortPoints函數

在 OpenCV 中,undistortPoints 函數用于將畸變的圖像點轉換為未畸變的點。這個函數特別有用在相機標定后,校正圖像中的點以消除鏡頭畸變。

函數原型

void cv::undistortPoints(InputArray src, OutputArray dst, InputArray cameraMatrix, InputArray distCoeffs, InputArray R = noArray(), InputArray P = noArray()
);

參數說明

  • src: 輸入的畸變點,通常是一個 (N \times 1 \times 2) 或 (N \times 2) 的矩陣,表示圖像中的點。
  • dst: 輸出的未畸變點,格式與 src 相同。
  • cameraMatrix: 相機內參矩陣,包含焦距和主點坐標。
  • distCoeffs: 畸變系數,包括徑向和切向畸變系數。
  • R: 可選參數,表示旋轉矩陣。如果沒有提供,默認為單位矩陣。
  • P: 可選參數,表示新的相機內參矩陣。如果沒有提供,默認為與 cameraMatrix 相同的矩陣。

示例代碼

以下是一個使用 undistortPoints 的示例:

#include <opencv2/opencv.hpp>
#include <vector>int main() {// 相機內參矩陣cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << 1000, 0, 320,0, 1000, 240,0, 0, 1);// 畸變系數cv::Mat distCoeffs = (cv::Mat_<double>(5, 1) << 0.1, -0.05, 0, 0, 0);// 輸入的畸變點std::vector<cv::Point2f> distortedPoints = { {100, 100}, {150, 150}, {200, 200} };// 輸出的未畸變點std::vector<cv::Point2f> undistortedPoints;// 使用 undistortPoints 函數cv::undistortPoints(distortedPoints, undistortedPoints, cameraMatrix, distCoeffs);// 打印未畸變的點for (const auto& point : undistortedPoints) {std::cout << "Undistorted Point: (" << point.x << ", " << point.y << ")\n";}return 0;
}

代碼解析

  1. 相機內參和畸變系數: 定義相機的內參矩陣和畸變系數。
  2. 輸入和輸出點: 創建一個包含畸變點的向量,并定義一個空的向量來存儲未畸變的結果。
  3. 調用 undistortPoints: 使用該函數將畸變點轉換為未畸變點。
  4. 輸出結果: 打印未畸變后的點。

注意事項

  • undistortPoints 函數假設輸入點是以歸一化坐標表示的(即相對于相機主點的坐標),如果你提供的是圖像像素坐標,你可能需要先將其轉換為歸一化坐標。
  • 如果你想生成新的圖像,可以使用 cv::undistort 函數,它將整個圖像進行畸變校正。

總結

undistortPoints 是一個強大的工具,用于消除圖像點的畸變,常用于相機標定和圖像處理任務中。通過正確使用內參和畸變系數,可以有效地校正圖像數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66276.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66276.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66276.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從玩具到工業控制--51單片機的跨界傳奇【3】

在科技的浩瀚宇宙中&#xff0c;51 單片機就像一顆獨特的星辰&#xff0c;散發著神秘而迷人的光芒。對于無數電子愛好者而言&#xff0c;點亮 51 單片機上的第一顆 LED 燈&#xff0c;不僅僅是一次簡單的操作&#xff0c;更像是開啟了一扇通往新世界的大門。這小小的 LED 燈&am…

boss直聘 __zp_stoken__ 逆向分析

聲明: 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 有相關問題請第一時間頭像私信聯系我刪…

【日志篇】(7.6) ? 01. 在macOS下刷新FortiAnalyzer固件 ? FortiAnalyzer 日志分析

【簡介】FortiAnalyzer 是 Fortinet Security Fabric 安全架構的基礎&#xff0c;提供集中日志記錄和分析&#xff0c;以及端到端可見性。因此&#xff0c;分析師可以更有效地管理安全狀態&#xff0c;將安全流程自動化&#xff0c;并快速響應威脅。具有分析和自動化功能的集成…

Linux 內核自旋鎖spinlock(一)

文章目錄 前言一、自旋鎖1.1 簡介1.2 API1.2.1 spin_lock/spin_unlock1.2.2 spin_lock_irq/spin_unlock_irq1.2.3 spin_lock_irqsave/spin_unlock_irqstore1.2.4 spin_lock_bh/spin_unlock_bh1.2.5 補充 二、自選鎖原理三、自旋鎖在內核的使用3.1 struct file3.2 struct dentry…

【太古新篇,智馭未來】 SFA系統成功上線

經過雙方團隊的不懈努力與緊密合作&#xff0c;eBest成功幫助香港太古可樂完成了SFA系統的全面上線&#xff01; 太古可樂&#xff0c;作為飲料行業的佼佼者&#xff0c;一直以來以其卓越的品質和深入人心的品牌形象深受消費者喜愛。然而&#xff0c;在快速變化的市場環境中&am…

Web安全|滲透測試|網絡安全

基礎入門(P1-P5) p1概念名詞 1.1域名 什么是域名&#xff1f; 域名&#xff1a;是由一串用點分隔的名字組成的Internet上某一臺計算機或計算機組的名稱&#xff0c;用于在數據傳輸時對計算機的定位標識&#xff08;有時也指地理位置&#xff09;。 什么是二級域名多級域名…

陳萍的設計創新:Kevlin Nexus榮獲倫敦設計獎,展示品牌設計的國際化與持續創新

近日,陳萍憑借其創新設計作品 Kevlin Nexus,成功斬獲 2024 倫敦設計獎。該獎項旨在表彰全球范圍內的優秀設計作品,表彰設計界最完美、最前沿的成就。倫敦設計獎是全球最具權威性和影響力的設計獎項之一,其評選標準以高水準的專業性和嚴格性著稱。作為全球設計界的頂級榮譽,倫敦…

qml DirectionalBlur詳解

1、概述 DirectionalBlur是QML&#xff08;Qt Modeling Language&#xff09;中用于創建方向模糊效果的一種圖形效果類型。它通過對源圖像的像素進行模糊處理&#xff0c;產生一種源項目朝著模糊方向移動的感知印象。這種模糊效果被應用到每個像素的兩側&#xff0c;因此設置方…

【Linux】【Vim】vim編輯器的用法

一、vim簡介 Vim是一款功能強大且高度可定制的文本編輯器&#xff0c;廣泛應用于Linux 和 Unix系統中。 它不僅繼承了vi編輯器的所有特性&#xff0c;還增加了許多新的功能&#xff0c;如語法高亮、代碼折疊、多級撤銷等。 Vim有三種主要的工作模式&#xff1a; 命令模式&am…

構建優雅、高效的 Nodejs 命令行工具 - Archons

目錄 項目簡介安裝基本用法樣例創建一個簡單的命令行工具使用archons上下文創建進度條 最后 項目地址: https://github.com/noctisynth/archons Bug反饋或功能請求&#xff1a;https://github.com/noctisynth/archons/issues 項目簡介 Archons意思是“執政官”&#xff0c;我使…

怎么投稿各大媒體網站?如何快速辨別一家媒體是否適合自己?

在做軟文營銷時&#xff0c;除去在官號和子賬號上投稿外&#xff0c;怎么投稿各大媒體網站是困擾中小企業主的一大難題。沒有多余賬號、運營成本太高&#xff0c;讓不少想做全平臺推廣的朋友止步于此。為了解決這些問題&#xff0c;今天就讓小編來分享一下&#xff0c;怎么在各…

MES設備日志采集工具

永久免費: <下載> <使用說明> 用途 定時全量或增量采集工控機,電腦文件或日志. 優勢 開箱即用: 解壓直接運行.不需額外下載.管理設備: 后臺統一管理客戶端.無人值守: 客戶端自啟動,自更新.穩定安全: 架構簡單,兼容性好,通過授權控制訪問. 架構 技術架構: Asp…

rhel7.9利用有網絡環境打包ansible

RHEL7.9激活(可省略) # 注冊 subscription-manager register --usernameyour_username --passwordyour_password --auto-attach # 查看訂閱狀態 subscription-manager list # 將 “enabled1” 改為 “enabled0” vi /etc/yum/pluginconf.d/subscription-manager.conf 配置阿…

Formality:參考設計/實現設計以及頂層設計

相關閱讀 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482??? Formality存在兩個重要的概念&#xff1a;參考設計/實現設計和頂層設計&#xff0c;本文就將對此進行詳細闡述。參考設計/實現設計是中兩個重要的全局概念&am…

網絡安全中攻擊溯源有哪些方法?

目前網絡攻擊已經成為常見的安全威脅之一&#xff0c;其造成的危害和損失都是不可估量的&#xff0c;因此網絡攻擊受到了高度重視。而當我們遭遇網絡攻擊時&#xff0c;攻擊溯源是一項非常重要的工作&#xff0c;可以幫助我們迅速發現并應對各類網絡攻擊行為&#xff0c;那么網…

國產編輯器EverEdit - 復制為RTF

1 復制為RTF 1.1 應用背景 在寫產品手冊或者其他文檔時&#xff0c;可能會用到要將產品代碼以樣例的形式放到文檔中&#xff0c;一般的文本編輯器拷貝粘貼到Word中也就是普通文本&#xff0c;沒有語法著色&#xff0c;這樣感觀上不是太好&#xff0c;為了讓讀者的感觀更好一點…

【設計模式-結構型】裝飾器模式

一、什么是裝飾器模式 裝飾器模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它的核心思想是在不改變原有對象結構的情況下&#xff0c;動態地給對象增加一些功能&#xff0c;從而達到擴展功能的目的。舉個例子&#xff0c;今天在家媽媽給蒸饅…

redux 結合 @reduxjs/toolkit 的使用

1&#xff0c;使用步驟 使用React Toolkit 創建 counterStore&#xff08;store目錄下&#xff09; --> 為React注入store&#xff08;src下面的index&#xff09; --> React組件使用store中的數據&#xff08;組件&#xff09; 2&#xff0c;例如下面有一個簡單加減的…

動態規劃【打家劫舍】

今天和大家分享一下動態規劃當中的打家劫舍題目&#xff0c;希望在大家刷題的時候提供一些思路 打家劫舍1&#xff1a; 題目鏈接&#xff1a; 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 題目描述&#xff1a; 你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋…

KVM創建ubuntu20.04虛機,部署K8S,再克隆出二份,做為Worker節點加入集群,通過Helm創建2個Pod,讓它們之間通過域名互訪

KVM創建ubuntu20.04虛機,部署K8S,再克隆出二份,做為Worker節點加入集群,通過Helm創建2個Pod,讓它們之間通過域名互訪 一.背景二.操作步驟1.安裝KVMA.在BIOS中開啟VT-dB.修改grub,開啟iommu在/etc/default/grub 中 GRUB_CMDLINE_LINUX行 添加 intel_iommuon iommupt重新創建引導…