StereoRectify()函數定義及用法畸變矯正與立體校正

?

畸變矯正是上一篇博文的遺留問題,當畸變系數和內外參數矩陣標定完成后,就應該進行畸變的矯正,以達到消除畸變的目的,此其一。

在該系列第一部分的博文中介紹的立體成像原理中提到,要通過兩幅圖像估計物點的深度信息,就必須在兩幅圖像中準確的匹配到同一物點,這樣才能根據該物點在兩幅圖像中的位置關系,計算物體深度。為了降低匹配的計算量,兩個攝像頭的成像平面應處于同一平面。但是,單單依靠嚴格的擺放攝像頭來達到這個目的顯然有些困難。立體校正就是利用幾何圖形變換(Geometric Image Transformation)關系,使得原先不滿足上述位置關系的兩幅圖像滿足該條件,此其二。

數學原理

  • 畸變矯正(compensate lens distortion)

畸變矯正的方法就是用上一篇博文給出的公式對像素位置進行重新映射。這里重新寫出重新映射的公式。

先矯正徑向畸變,

再矯正切向畸變,

  • 立體矯正(stereo rectify)

立體矯正能夠有效降低立體匹配的計算量,立體矯正的具體作用見下圖,

立體矯正前,

立體矯正后,

立體矯正的算法原理沒有詳細了解,此處從略。

OpenCV相關函數說明

  • 畸變矯正函數?undistort()?

?undistort()?是獨立的一個畸變矯正函數,一次性可以完成映射矩陣的求解和重新映射。下面我們還會看到把這兩步分開來做的函數。

調用方法,

?

  1. src-輸入未經過矯正的圖像
  2. dst-經過矯正后輸出的圖像
  3. cameraMatrix-標定而得到的攝像機矩陣
  4. distCoeffs-標定得到的攝像機畸變矩陣
  5. newCameraMatrix-輸入矯正后的攝像機矩陣(可以省略)
  • 立體標定函數?stereoCalibrate()?

?stereoCalibrate()?是用來標定一個立體攝像頭的,也就是同時標定兩個攝像頭。標定的結果除了能夠求出兩個攝像頭的內外參數矩陣,跟能夠得出兩個攝像頭的位置關系R,T。

調用方法,

double stereoCalibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1,InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1,InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, Size imageSize, OutputArray R,OutputArray T, OutputArray E, OutputArray F, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6), intflags=CALIB_FIX_INTRINSIC )

?

  1. objectPoints-?vector<point3f>?型的數據結構,存儲標定角點在世界坐標系中的位置
  2. imagePoints1-?vector<vector<point2f>>?型的數據結構,存儲標定角點在第一個攝像機下的投影后的亞像素坐標
  3. imagePoints2-?vector<vector<point2f>>?型的數據結構,存儲標定角點在第二個攝像機下的投影后的亞像素坐標
  4. cameraMatrix1-輸入/輸出型的第一個攝像機的相機矩陣。如果CV_CALIB_USE_INTRINSIC_GUESS , CV_CALIB_FIX_ASPECT_RATIO ,CV_CALIB_FIX_INTRINSIC , or CV_CALIB_FIX_FOCAL_LENGTH其中的一個或多個標志被設置,該攝像機矩陣的一些或全部參數需要被初始化
  5. distCoeffs1-第一個攝像機的輸入/輸出型畸變向量。根據矯正模型的不同,輸出向量長度由標志決定
  6. cameraMatrix2-輸入/輸出型的第二個攝像機的相機矩陣。參數意義同第一個相機矩陣相似
  7. distCoeffs2-第一個攝像機的輸入/輸出型畸變向量。根據矯正模型的不同,輸出向量長度由標志決定
  8. imageSize-圖像的大小
  9. R-輸出型,第一和第二個攝像機之間的旋轉矩陣
  10. T-輸出型,第一和第二個攝像機之間的平移矩陣
  11. E-輸出型,基本矩陣
  12. F-輸出型,基礎矩陣
  13. term_crit-迭代優化的終止條件
  14. flag-

    • ?CV_CALIB_FIX_INTRINSIC?如果該標志被設置,那么就會固定輸入的cameraMatrix和distCoeffs不變,只求解

      $R,T,E,F

    • $.
    • ?CV_CALIB_USE_INTRINSIC_GUESS?根據用戶提供的cameraMatrix和distCoeffs為初始值開始迭代
    • ?CV_CALIB_FIX_PRINCIPAL_POINT?迭代過程中不會改變主點的位置
    • ?CV_CALIB_FIX_FOCAL_LENGTH?迭代過程中不會改變焦距
    • ?CV_CALIB_SAME_FOCAL_LENGTH?強制保持兩個攝像機的焦距相同
    • ?CV_CALIB_ZERO_TANGENT_DIST?切向畸變保持為零
    • ?CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6?迭代過程中不改變相應的值。如果設置了?CV_CALIB_USE_INTRINSIC_GUESS?將會使用用戶提供的初始值,否則設置為零
    • ?CV_CALIB_RATIONAL_MODEL?畸變模型的選擇,如果設置了該參數,將會使用更精確的畸變模型,distCoeffs的長度就會變成8
  • 立體校正函數?stereoRectify()?

?stereoRectify()?的作用是為每個攝像頭計算立體校正的映射矩陣。所以其運行結果并不是直接將圖片進行立體矯正,而是得出進行立體矯正所需要的映射矩陣。

調用方法,

void stereoRectify(InputArray cameraMatrix1, InputArray distCoeffs1, InputArray cameraMatrix2,InputArray distCoeffs2, Size imageSize, InputArray R, InputArray T,OutputArray R1, OutputArray R2, OutputArray P1, OutputArray P2, OutputArray Q, int flags=CALIB_ZERO_DISPARITY, double alpha=-1, Size newImageSize=Size(), Rect* validPixROI1=0, Rect* validPixROI2=0 )

?

  1. cameraMatrix1-第一個攝像機的攝像機矩陣
  2. distCoeffs1-第一個攝像機的畸變向量
  3. cameraMatrix2-第二個攝像機的攝像機矩陣
  4. distCoeffs1-第二個攝像機的畸變向量
  5. imageSize-圖像大小
  6. R-?stereoCalibrate()?求得的R矩陣
  7. T-?stereoCalibrate()?求得的T矩陣
  8. R1-輸出矩陣,第一個攝像機的校正變換矩陣(旋轉變換)
  9. R2-輸出矩陣,第二個攝像機的校正變換矩陣(旋轉矩陣)
  10. P1-輸出矩陣,第一個攝像機在新坐標系下的投影矩陣
  11. P2-輸出矩陣,第二個攝像機在想坐標系下的投影矩陣
  12. Q-4*4的深度差異映射矩陣
  13. flags-可選的標志有兩種零或者?CV_CALIB_ZERO_DISPARITY?,如果設置?CV_CALIB_ZERO_DISPARITY?的話,該函數會讓兩幅校正后的圖像的主點有相同的像素坐標。否則該函數會水平或垂直的移動圖像,以使得其有用的范圍最大
  14. alpha-拉伸參數。如果設置為負或忽略,將不進行拉伸。如果設置為0,那么校正后圖像只有有效的部分會被顯示(沒有黑色的部分),如果設置為1,那么就會顯示整個圖像。設置為0~1之間的某個值,其效果也居于兩者之間。
  15. newImageSize-校正后的圖像分辨率,默認為原分辨率大小。
  16. validPixROI1-可選的輸出參數,Rect型數據。其內部的所有像素都有效
  17. validPixROI2-可選的輸出參數,Rect型數據。其內部的所有像素都有效
  • 映射變換計算函數?initUndistortRectifyMap()?

該函數功能是計算畸變矯正和立體校正的映射變換。

調用方法,

void initUndistortRectifyMap(InputArray cameraMatrix, InputArray distCoeffs, InputArray R,InputArray newCameraMatrix, Size size, int m1type, OutputArray map1, OutputArray map2)

?

  1. cameraMatrix-攝像機參數矩陣
  2. distCoeffs-畸變參數矩陣
  3. R-?stereoCalibrate()?求得的R矩陣
  4. newCameraMatrix-矯正后的攝像機矩陣(可省略)
  5. Size-沒有矯正圖像的分辨率
  6. m1type-第一個輸出映射的數據類型,可以為?CV_32FC1? 或??CV_16SC2?
  7. map1-輸出的第一個映射變換
  8. map2-輸出的第二個映射變換
  • 幾何變換函數?remap()?

調用方法,

void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation,int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

?

  1. src-原圖像
  2. dst-幾何變換后的圖像
  3. map1-第一個映射,無論是點(x,y)或者單純x的值都需要是CV_16SC2 ,CV_32FC1 , 或 CV_32FC2類型
  4. map2-第二個映射,y需要是CV_16UC1 , CV_32FC1類型。或者當map1是點(x,y)時,map2為空。
  5. interpolation-插值方法,但是不支持最近鄰插值
  6. 剩下兩個我也沒看懂,但是一般示例程序中不會設置

基于OpenCV的仿真

  • 仿真程序

View Code

?

子函數calibrate()calcChessboardCorners()分別是用來表達相機和計算objectPoints的。函數體如下,

View Code

?

復制代碼

1 static void calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>& corners)
2 {
3     corners.resize(0);
4     for (int i = 0; i < boardSize.height; i++)        //height和width位置不能顛倒
5     for (int j = 0; j < boardSize.width; j++)
6     {
7         corners.push_back(Point3f(j*squareSize, i*squareSize, 0));
8     }
9 }

復制代碼

?

  • 仿真結果

分類: Computer Vision,OpenCV,數字圖像處理

標簽: opencv, Computer Vision

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

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

相關文章

死磕 java集合之TreeMap源碼分析(三)- 內含紅黑樹分析全過程

2019獨角獸企業重金招聘Python工程師標準>>> 歡迎關注我的公眾號“彤哥讀源碼”&#xff0c;查看更多源碼系列文章, 與彤哥一起暢游源碼的海洋。 刪除元素 刪除元素本身比較簡單&#xff0c;就是采用二叉樹的刪除規則。 &#xff08;1&#xff09;如果刪除的位置有兩…

Linux:進程實例信息(/proc)

https://blog.csdn.net/test1280/article/details/73632333 Linux:進程實例信息&#xff08;/proc&#xff09; 問幾個問題&#xff1a; 1.怎么知道一個進程對應哪個可執行文件&#xff1f; 2.怎么知道一個進程的資源限制&#xff1f; 3.怎么知道一個進程所處的環境&#xff1f…

四元素理解

旋轉變換_四元數 2017年03月29日 11:59:38 csxiaoshui 閱讀數&#xff1a;5686 1.簡介 四元數是另一種描述三維旋轉的方式&#xff0c;四元數使用4個分量來描述旋轉&#xff0c;四元數的描述方式如下&#xff1a; qsxiyjzk,(s,x,y,z∈?&#xff09;i2j2k2ijk?1 四元數的由…

31、SAM文件中flag含義解釋工具--轉載

轉載&#xff1a;http://www.cnblogs.com/nkwy2012/p/6362996.html SAM是Sequence Alignment/Map 的縮寫。像bwa等軟件序列比對結果都會輸出這樣的文件。samtools網站上有專門的文檔介紹SAM文件。具體地址&#xff1a;http://samtools.sourceforge.net/SAM1.pdf很多人困惑SAM文…

《Head First設計模式》批注系列(一)——觀察者設計模式

最近在讀《Head First設計模式》一書&#xff0c;此系列會引用源書內容&#xff0c;但文章內容會更加直接&#xff0c;以及加入一些自己的理解。 觀察者模式&#xff08;有時又被稱為模型-視圖&#xff08;View&#xff09;模式、源-收聽者(Listener)模式或從屬者模式&#xff…

PYPL 4 月排行:Python 最流行,Java 還行不行?

開發四年只會寫業務代碼&#xff0c;分布式高并發都不會還做程序員&#xff1f; PYPL 發布了 4 月份的編程語言排行榜。 前五的分別是&#xff1a;Python、Java、Javascript、C# 和 PHP。可以看到&#xff0c;榜單沒有什么大變化&#xff0c;但是相比去年 4 月份&#xff0c;…

兩個向量的旋轉矩陣與四元素

兩向量的夾角 2017年06月20日 17:38:11 csxiaoshui 閱讀數&#xff1a;36764 怎么計算兩個向量間的夾角呢&#xff1f; 這里主要分兩種情況&#xff0c;對于二維向量和三維向量來分別討論。 1. 二維向量 二維向量的情況相對簡單&#xff0c;根據向量間的點乘關系 v1?v2|…

順序表

一、數據是如何在內存中存儲的&#xff1f; 32位系統中char&#xff0c;int型數據在內存中的存儲方式&#xff1a; char占1byte&#xff08;8bit&#xff09;int占4byte&#xff08;32bit&#xff09;假設我們有一個int類型的值&#xff0c;它從0x01開始&#xff0c;一個int占據…

Establishing SSL connection without server's identity verification is not recommended.

完全描述:Establishing SSL connection without servers identity verification is not recommended. According to MySQL 5.5.45, 5.6.26 and 5.7.6 requirements SSL connection must be established by default if explicit option isnt set. For compliance with existing …

四元素的真面目..........簡單粗暴

作者&#xff1a;Yang Eninala 鏈接&#xff1a;https://www.zhihu.com/question/23005815/answer/33971127 來源&#xff1a;知乎 著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。 根據我的理解&#xff0c;大多數人用漢密爾頓四元數就只…

2.自定義變量調節器

① 使用registerPlugin()方法來擴充變量調節器 該方法接收3個參數 1. 字符串modifier 2. 插件函數的名字 3. PHP回調函數 示例&#xff1a;自定義一個變量調節器&#xff0c;可以改變文字的顏色和大小 第一步&#xff1a;調用smarty對象的registerPlugin&#xff08;&#x…

SpringBoot2構建基于RBAC權限模型的駕校代理小程序后端

本項目是使用SpringBoot2構建的一套基于RBAC權限模型的后臺管理系統&#xff0c;前端是微信小程序。 項目地址: github.com/fuyunwang/D… 項目的緣由 最近接了個外包,主要是針對于駕校開發一個代理小程序。目的是為了方便駕校的管理來招攬學員,同時方便維護學員和代理信息。 項…

while read line的問題

循環中的重定向或許你應該在其他腳本中見過下面的這種寫法&#xff1a;while read linedo…done < file剛開始看到這種結構時&#xff0c;很難理解< file是如何與循環配合在一起工作的。因為循環內有很多條命令&#xff0c;而我們之前接觸的重定向都是為一條命令工作的。…

Linemod;理解

Linemod 代碼筆記 2019年03月11日 16:18:30 haithink 閱讀數&#xff1a;197 最近了解到 Linemod 這個模板匹配算法&#xff0c;印象不錯 準備仔細學習一下&#xff0c;先做點代碼筆記&#xff0c;免得后面不好回顧 目前的筆記基本上把 核心流程都分析得比較清楚了&#xff0…

Swift3中數組創建方法

轉載自&#xff1a;http://blog.csdn.net/bwf_erg/article/details/70858865 數組是由一組類型相同的元素構成的有序數據集合。數組中的集合元素是有 序的&#xff0c;而且可以重復出現。 1 數組創建 在Swift語言中&#xff0c;數組的類型格式為&#xff1a; Array<ElementT…

BZOJ 5249: [2018多省省隊聯測]IIIDX(貪心 + 線段樹)

題意 這一天&#xff0c;\(\mathrm{Konano}\) 接到了一個任務&#xff0c;他需要給正在制作中的游戲 \(\mathrm{《IIIDX》}\) 安排曲目 的解鎖順序。游戲內共有\(n\) 首曲目&#xff0c;每首曲目都會有一個難度 \(d\) &#xff0c;游戲內第 \(i\) 首曲目會在玩家 Pass 第 \(\lf…

手眼標定

Eye-in-hand和Eye-to-hand問題求解和實驗 2018年12月07日 00:00:40 百川木易 閱讀數 3018 2018/12/5 By Yang Yang&#xff08;yangyangipp.ac.cn&#xff09; 本文所有源碼和仿真場景文件全部公開&#xff0c;點擊Gitee倉庫鏈接。 文章目錄 問題描述Eye-in-hand問題求解公式…

RNN總結

RNN既可以表述為循環神 經網絡&#xff08;recurrent neural network&#xff09;&#xff0c;也可以表述為遞歸神經網絡&#xff08;recursive neural network&#xff09;&#xff0c;前者一般用于處理以時間序列為輸入的問題&#xff08;比如把一個句子看成詞組成的序列&…

Problem 2. number題解

number&#xff1a;數學二分圖匹配 首先&#xff0c;如果S<N,那么S1&#xff0c;S2...N這些數直接放在S1,S2...N的位置上(如果其他數x放在這些位置上面&#xff0c;這些數不放在對應位置&#xff0c;那么x一定能放在這些數放的位置&#xff0c;所以直接交換即可)所以可以直接…

SSD列子

一、介紹 本博文主要介紹實現通過SSD物體檢測方式實現工件裂紋檢測。裂紋圖像如下所示&#xff1a; 二、關于SSD算法 具體算法不再闡述&#xff0c;詳細請參考&#xff1a; https://blog.csdn.net/u013989576/article/details/73439202 https://blog.csdn.net/xiaohu2022/arti…