深藍學院自主泊車第3次作業-IPM

目錄

  • 1 題目介紹
  • 2 求解

1 題目介紹

已知魚眼相機的參數,

  1. image_width,表示圖像的寬度
  2. image_height,表示圖像的高度
  3. ξ \xi ξ,表示魚眼相機參數
  4. k 1 k_1 k1? k 2 k_2 k2?,表示徑向相機參數
  5. p 1 p_1 p1? p 2 p_2 p2?,表示切向相機參數
  6. f x f_x fx? f y f_y fy?,表示相機的焦距
  7. c x c_x cx? c y c_y cy?,表示相機的光心

已知相機坐標系到車體坐標系的變換矩陣,

  1. t t t,表示平移向量
  2. R R R,表示旋轉矩陣

給出4組這樣的參數及相應的圖片,請求解最終的IPM圖片。

2 求解

(1)設置最終IPM圖像的尺寸為 1000 × 1000 1000\times 1000 1000×1000(用符號 i p m _ i m g _ h × i p m _ i m g _ w ipm\_img\_h\times ipm\_img\_w ipm_img_h×ipm_img_w表示),其中每個像素的長度和寬度為0.02米(用符號 p i x e l _ s c a l e _ pixel\_scale\_ pixel_scale_表示)。

(2)遍歷IPM圖像中的每個像素 ( u , v ) (u,v) (u,v),那么可以直到機體坐標系的點的坐標值為,
p v = [ ? ( 0.5 ? i p m _ i m g _ h ? u ) ? p i x e l _ s c a l e 0.5 ? ( i p m _ i m g _ w ? v ) ? p i x e l _ s c a l e 0 ] (1) p_v = \begin{bmatrix}-(0.5 \cdot ipm\_img\_h - u) * pixel\_scale \\ 0.5 \cdot (ipm\_img\_w - v) \cdot pixel\_scale \\ 0 \end{bmatrix} \tag{1} pv?= ??(0.5?ipm_img_h?u)?pixel_scale0.5?(ipm_img_w?v)?pixel_scale0? ?(1)
(3)求得在相機坐標系下的坐標值為,
p c = R T ? p v ? R T ? t (2) p_c = R^T \cdot p_v - R^T \cdot t \tag{2} pc?=RT?pv??RT?t(2)

p c p_c pc?歸一化操作,得到 p c _ n o r m p_{c\_norm} pc_norm?

(4)此時,得到單位平面上的點 ( x 1 , y 1 ) (x_1,y_1) (x1?,y1?)
x 1 = p c _ n o r m [ 0 ] p c _ n o r m [ 2 ] + ξ y 1 = p c _ n o r m [ 1 ] p c _ n o r m [ 2 ] + ξ (3) \begin{align} x_1 = \frac{p_{c\_norm}[0]} { p_{c\_norm}[2] + \xi} \\ y_1 = \frac{p_{c\_norm}[1]} { p_{c\_norm}[2] + \xi} \end{align} \tag{3} x1?=pc_norm?[2]+ξpc_norm?[0]?y1?=pc_norm?[2]+ξpc_norm?[1]??(3)

(5)得到畸變后的點 ( x 2 , y 2 ) (x_2,y_2) (x2?,y2?)
r = x 1 2 + y 1 2 x 2 = x 1 ( 1 + k 1 r 2 + k 2 r 4 ) + 2 p 1 x 1 y 1 + p 2 ( r 2 + 2 x 1 2 ) y 2 = y 1 ( 1 + k 1 r 2 + k 2 r 4 ) + p 1 ( r 2 + 2 y 1 2 ) + 2 p 2 x 1 y 1 (4) \begin{align} r &= \sqrt{x_1^2 + y_1^2} \\ x_2 &= x_1 (1 + k_1 r^2 + k_2 r^4) + 2 p_1 x_1 y_1 + p_2(r^2+2x_1^2) \\ y_2 &= y_1 (1 + k_1r^2+k_2r^4) + p_1(r^2+2y_1^2) + 2p_2x_1y_1 \end{align} \tag{4} rx2?y2??=x12?+y12? ?=x1?(1+k1?r2+k2?r4)+2p1?x1?y1?+p2?(r2+2x12?)=y1?(1+k1?r2+k2?r4)+p1?(r2+2y12?)+2p2?x1?y1??(4)

(6)將點 ( x 2 , y 2 ) (x_2,y_2) (x2?,y2?)投影到圖像坐標系,得到 ( u 1 , v 1 ) (u_1,v_1) (u1?,v1?)
u 1 = f x x 2 + c x v 1 = f y y 2 + c y (5) \begin{align} u_1 &= f_x x_2 + c_x \\ v_1 &= f_y y_2 + c_y \end{align} \tag{5} u1?v1??=fx?x2?+cx?=fy?y2?+cy??(5)
將魚眼相機中的點 ( u 1 , v 1 ) (u_1,v_1) (u1?,v1?)的顏色賦給IPM圖像中的 ( u . v ) (u.v) (u.v)坐標。

此處需要注意:

tip1: 獲取顏色時需要四舍五入 u 1 u_1 u1? v 1 v_1 v1?

tip2: 如果IPM圖像中 ( u , v ) (u,v) (u,v)坐標已經被賦予了顏色信息,記錄它的次數,那么最終的顏色值通過次數來加權平均,
c o l o r = t o t a l ? 1 t o t a l ? c o l o r + 1 t o t a l ? n e w _ c o l o r (6) color = \frac{total-1}{total} \cdot color + \frac{1}{total} \cdot new\_color \tag{6} color=totaltotal?1??color+total1??new_color(6)

最終的代碼如下,

cv::Mat IPM::GenerateIPMImage(const std::vector<cv::Mat>& images) const {// Initialize a black IPM image with dimensions ipm_img_h_ x ipm_img_w_ and 3 channels (RGB)cv::Mat ipm_image = cv::Mat::zeros(ipm_img_h_, ipm_img_w_, CV_8UC3);std::vector<std::vector<int>> uv_cnt(ipm_img_h_, std::vector<int>(ipm_img_w_, 0)); // Check if the number of input images matches the number of camerasif (images.size() != cameras_.size()) {// If not, print an error message and return the initialized black IPM imagestd::cout << "IPM not init normaly !" << std::endl;return ipm_image;}// Iterate over each pixel in the IPM imagefor (int u = 0; u < ipm_img_w_; ++u) {for (int v = 0; v < ipm_img_h_; ++v) {// Calculate the point p_v in vehicle coordinates, p_v is corresponding to the current pixel (u, v).// Assume the height of the ipm_image in vehicle coordinate is 0.Eigen::Vector3d p_v(-(0.5 * ipm_img_h_ - u) * pixel_scale_,(0.5 * ipm_img_w_ - v) * pixel_scale_, 0);// Iterate over each camerafor (size_t i = 0; i < cameras_.size(); ++i) {// Project the vehile point p_v into the image plane uvTODO begin/////將vehicle系下的點轉到camera系下Eigen::Vector3d p_c = cameras_[i].T_vehicle_cam_.inverse() * p_v;// Eigen::Maxtrix3d R1 = cameras_[i].T_vehicle_cam_.linear();// Eigen::Vector3d t1 = cameras_[i].translation();if (p_c[2] < 0.0) { //過濾z值小于0的點continue;}//將camera系下的點轉到圖像系下 Eigen::Vector3d norm_p_c = p_c.normalized();norm_p_c[2] += cameras_[i].xi_;//unit plane上的點(x1,y1)double x1 = norm_p_c[0] / norm_p_c[2];double y1 = norm_p_c[1] / norm_p_c[2];double r_2 = x1 * x1 + y1 * y1;//獲取參數k1,k2,p1,p2double k1 = cameras_[i].D_.at<double>(0, 0);double k2 = cameras_[i].D_.at<double>(1, 0);double p1 = cameras_[i].D_.at<double>(2, 0);double p2 = cameras_[i].D_.at<double>(3, 0);//畸變后的點(x2,y2)double x2 = x1 * (1 + k1 * r_2 + k2 * r_2 * r_2) + 2.0 * p1 * x1 * y1 + p2 * (r_2 + 2 * x1 * x1);double y2 = y1 * (1 + k1 * r_2 + k2 * r_2 * r_2) + p1 * (r_2 + 2 * y1 * y1) + 2.0 * p2 * x1 * y1;//獲取參數fx,fy,cx,cydouble fx = cameras_[i].K_.at<double>(0, 0);double fy = cameras_[i].K_.at<double>(1, 1);double cx = cameras_[i].K_.at<double>(0, 2);double cy = cameras_[i].K_.at<double>(1, 2);//圖像坐標系下的點(u1,v1)double u1 = fx * x2 + cx;double v1 = fy * y2 + cy;//四舍五入,得到最終的uv0,uv1int uv0 = static_cast<int>(std::round(u1));int uv1 = static_cast<int>(std::round(v1)); TODO end/// (uv0, uv1) is the projected pixel from p_v to cameras_[i]// Skip this point if the projected coordinates are out of bounds of the camera imageif (uv0 < 0 || uv0 >= cameras_[i].width_ || uv1 < 0 ||uv1 >= cameras_[i].height_) {continue;}// Get the pixel color from the camera image and set it to the IPM image// If the IPM image pixel is still black (not yet filled), directly assign the colorif (ipm_image.at<cv::Vec3b>(v, u) == cv::Vec3b(0, 0, 0)) {ipm_image.at<cv::Vec3b>(v, u) = images[i].at<cv::Vec3b>(uv1, uv0);uv_cnt[v][u] += 1;} else {// Otherwise, average the existing color with the new coloruv_cnt[v][u] += 1;double total = 1.0 * uv_cnt[v][u]; ipm_image.at<cv::Vec3b>(v, u) = (total - 1.0) / total * ipm_image.at<cv::Vec3b>(v, u) + 1.0 / total * images[i].at<cv::Vec3b>(uv1, uv0); }}}}// Return the generated IPM imagereturn ipm_image;
}

最終的IPM圖像如下,

在這里插入圖片描述

給出的參考IPM圖像如下,

在這里插入圖片描述

本方法得到的IPM圖像有更清晰的停車位線!

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

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

相關文章

核貨寶助力連鎖門店訂貨數字化轉型升級

在競爭激烈的連鎖零售行業&#xff0c;傳統訂貨模式弊端日益凸顯&#xff0c;嚴重制約著企業的發展。核貨寶訂貨系統以其卓越的數字化解決方案&#xff0c;為連鎖門店訂貨帶來了全方位的變革&#xff0c;助力企業實現數字化轉型升級&#xff0c;在市場中搶占先機。 一、增強總部…

2.最多提取子串數目(100分)-附帶Java逐行解析

題目 給定 [a-z]&#xff0c;26個英文字母小寫字符串組成的字符串 A 和 B&#xff0c;其中 A 可能存在重復字母&#xff0c;B 不會存在重復字母&#xff0c;現從字符串 A 中按規則挑選一些字母&#xff0c;可以組成字符串B。 挑選規則如下&#xff1a; 同一個位置的字母只能挑…

AutoGen 技術博客系列 八:深入剖析 Swarm—— 智能體協作的新范式

本系列博文在掘金同步發布, 更多優質文章&#xff0c;請關注本人掘金賬號&#xff1a; 人肉推土機的掘金賬號 AutoGen系列一&#xff1a;基礎介紹與入門教程 AutoGen系列二&#xff1a;深入自定義智能體 AutoGen系列三&#xff1a;內置智能體的應用與實戰 AutoGen系列四&am…

力扣每日一題【算法學習day.132】

前言 ###我做這類文章一個重要的目的還是記錄自己的學習過程&#xff0c;我的解析也不會做的非常詳細&#xff0c;只會提供思路和一些關鍵點&#xff0c;力扣上的大佬們的題解質量是非常非常高滴&#xff01;&#xff01;&#xff01; 習題 1.統計相似字符串對的數目 題目鏈…

C語言.h頭文件的寫法

頭文件的內容 #ifndef __SEQUENCE_LIST_H // 定義以防止遞歸包含 #define __SEQUENCE_LIST_H // (1)、其它頭文件 #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <stdbool.h> // (2)、宏定義(函數、變量、常量) // (3)、…

Spring AI + Ollama 實現調用DeepSeek-R1模型API

一、前言 隨著人工智能技術的飛速發展&#xff0c;大語言模型&#xff08;LLM&#xff09;在各個領域的應用越來越廣泛。DeepSeek 作為一款備受矚目的國產大語言模型&#xff0c;憑借其強大的自然語言處理能力和豐富的知識儲備&#xff0c;迅速成為業界關注的焦點。無論是文本生…

自學Java-AI結合GUI開發一個石頭迷陣的游戲

自學Java-AI結合GUI開發一個石頭迷陣的游戲 準備環節1、創建石頭迷陣的界面2、打亂順序3、控制上下左右移動4、判斷是否通關5、統計移動步驟&#xff0c;重啟游戲6、拓展問題 準備環節 技術&#xff1a; 1、GUI界面編程 2、二維數組 3、程序流程控制 4、面向對象編程 ? \bulle…

C語言的內存分配:malloc和free

使用庫函數分配和管理內存。在運行時&#xff0c;分配更多的內存給程序使用&#xff0c;主要工具是malloc函數&#xff0c;這個函數接受一個參數&#xff1a;所需要要的內存字節數。malloc函數會找到合適的空閑內存塊&#xff0c;這樣的內存是匿名的&#xff0c;即malloc分配了…

本地安裝 Grafana Loki

本地安裝 Grafana Loki 一、 安裝 Loki1. 下載 Loki2. 創建 Loki 配置文件3. 創建 Loki 服務 二、安裝 Promtail1. 下載 Promtail2. 創建 Promtail 配置文件3. 創建 Promtail 服務 三、 安裝 Grafana四、啟動所有服務五、添加loki 數據源1. 添加儀表板2. 日志查詢面板 json 參考…

趣味數學300題1981版-十五個正方形

分析&#xff1a;移動兩根變成11個正方形很簡單&#xff1a; 移動4根變成15個正方形&#xff0c;分析&#xff1a; 一個田字格包含5個正方形&#xff0c;若要15個正方形需要3個田字格&#xff0c;如果3個田字格完全不重合&#xff0c;需要6*318根火柴。如果合并正方形的邊&…

IDEA——Mac版快捷鍵

目錄 按鍵含義常用組合代碼生成快捷鍵&#xff1a;代碼追蹤快捷鍵&#xff1a;高效編輯快捷鍵&#xff1a;代碼重構快捷鍵&#xff1a;工具類快捷鍵&#xff1a;常規文件操作快捷鍵&#xff1a; 按鍵含義 ? command Command鍵&#xff08;?&#xff09;相當于Windows中的Con…

基于Spring Boot的興順物流管理系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

Prompt:創造性的系統分析者

分享的提示詞&#xff1a; 你是一個創造性的系統分析者&#xff0c;作為咨詢師&#xff0c;你具有以下特質&#xff1a; 基礎能力&#xff1a; 深入理解我的系統性模式 識別模式間的隱藏聯系 發現出人意料的關聯 提供令人驚訝的洞見 工作方式&#xff1a; 在每次回應中至少…

Andorid 學習 Compose UI(1):Box

今天學習和實驗一下Android 的compose UI&#xff0c;寫一些很小的Demo實驗。下面和css 布局有點相似性。 如Box 看起來像html 當中的 div &#xff0c;compose UI 提供Modifier 很多設置。你會發現Text,Box,Row,Image等組件 都有這個屬性。我們處理任務包括對齊布局&#xff0…

Selenium實戰案例1:論文pdf自動下載

在上一篇文章中&#xff0c;我們介紹了Selenium的基礎用法和一些常見技巧。今天&#xff0c;我們將通過中國科學&#xff1a;信息科學網站內當前目錄論文下載這一實戰案例來進一步展示Selenium的web自動化流程。 目錄 中國科學&#xff1a;信息科學當期目錄論文下載 1.網頁內…

《炒股養家心法.pdf》 kimi總結

《炒股養家心法.pdf》這篇文章詳細闡述了一位超級游資炒股養家的心得與技巧&#xff0c;展示了其從40萬到10億的股市傳奇。以下是文章中炒股技巧和心得的詳細總結&#xff1a; 1.核心理念 市場情緒的理解&#xff1a;炒股養家強調&#xff0c;股市的本質是群體博弈&#xff0c…

2025年華為手機解鎖BL的方法

注&#xff1a;本文是我用老機型測試的&#xff0c;新機型可能不適用 背景 華為官方已經在2018年關閉了申請BL解鎖碼的通道&#xff0c;所以華為手機已經無法通過官方獲取解鎖碼。最近翻出了一部家里的老手機華為暢玩5X&#xff0c;想著能不能刷個系統玩玩&#xff0c;但是卡…

Perfectly Clear WorkBench深度解析:專業圖像處理軟件的高效應用

在圖像處理領域,面對照片曝光不足、色彩失真、細節模糊等常見問題,一款專業且高效的圖像處理軟件顯得尤為重要。今天,本文將為大家詳細介紹Perfectly Clear WorkBench這款圖像處理軟件,幫助大家更好地了解并應用其功能,提升照片質量。 一、智能圖像校正,解決常見問題 Pe…

使用 DistilBERT 進行資源高效的自然語言處理

DistilBERT 是 BERT 的一個更小、更快的版本&#xff0c;在減少資源消耗的同時仍能保持良好性能。對于計算能力和內存受限的環境來說&#xff0c;它是一個理想的選擇。 在自然語言處理&#xff08;NLP&#xff09;中&#xff0c;像 BERT 這樣的模型提供了高精度和出色的性能。然…

【后端基礎】布隆過濾器原理

文章目錄 一、Bloom Filter&#xff08;布隆過濾器&#xff09;概述1. Bloom Filter 的特點2. Bloom Filter 的工作原理 二、示例1. 添加與查詢2. 假陽性 三、Bloom Filter 的操作1、假陽性概率2、空間效率3、哈希函數的選擇 四、應用 Bloom Filter 是一種非常高效的概率型數據…