女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

攝像機標(biāo)定和立體標(biāo)定

QQ475400555 ? 來源:機器視覺沙龍 ? 2023-03-21 10:17 ? 次閱讀

嘗試用OpenCV來實現(xiàn)立體視覺也有一段時間了,主要的參考資料就是Learning OpenCV十一、十二章和OpenCV論壇上一些前輩的討論。過程中磕磕碰碰,走了不少彎路,終于在前不久解決了最頭大的問題,把整個標(biāo)定、校準(zhǔn)、匹配的流程調(diào)試成功。(雖然還有一些問題至今尚未搞清)

在這里寫這篇文章,第一方面是給自己一個總結(jié),第二方面是感覺OpenCV立體視覺方面的資料還是相當(dāng)零散和不完整,新手入門需要花很長時間才能摸索出來,第三方面,也是自己在過程中有些問題仍舊迷迷糊糊,希望可以拋磚引玉。

1.攝像頭

我用的攝像頭是淘寶上買的三維攝像頭,兩個USB Camera加一個可調(diào)節(jié)的支架。實物照片如下

1.1 三維攝像頭實物圖

雙USB攝像頭的OpenCV驅(qū)動可以參考以下鏈接

http://www.opencv.org.cn/index.php/使用DirectShow采集圖像

將上面代碼復(fù)制到自己的工程之后還需要對工程或者編譯環(huán)境做一下設(shè)置

VC6下的詳盡設(shè)置可以見代碼的注釋(修改工程的屬性)

VS2008中的設(shè)置也可以參照代碼注釋中VC++2005的設(shè)置(修改編譯環(huán)境)

2. 標(biāo)定

由于OpenCV中cvStereoCalibrate總是會得到很夸張的結(jié)果(見下文5.1問題描述),所以最后還是決定用Bouguet的Matlab標(biāo)定工具箱立體標(biāo)定,再將標(biāo)定的結(jié)果讀入OpenCV,來進行后續(xù)圖像校準(zhǔn)和匹配。

Matlab標(biāo)定工具箱的參考鏈接如下:

http://www.vision.caltech.edu/bouguetj/calib_doc/

上面有詳細(xì)的使用步驟,用起來相當(dāng)?shù)姆奖恪?/p>

以下是我個人用Matlab工具箱進行立體標(biāo)定的步驟,供參考,如果需要更詳細(xì)步驟的話還是參照上面的鏈接

把Matlab工具箱的文件copy到對應(yīng)目錄下,把所要標(biāo)定的棋盤圖也放到.m文件所在的目錄下,然后在Matlab命令行窗口中打入calib_gui,選擇Standard之后便出現(xiàn)以下窗口

2.1. calilb_gui面板

我們先對右攝像頭的標(biāo)定,所以先把從右攝像頭上采集到的棋盤圖復(fù)制到工具箱目錄下。

點擊Image names, 命令行窗口會提示你輸入圖片的basename以及圖片的格式(比如你圖片文件名是right1, right2, …, right10,basename就是right),然后Matlab會自動幫你讀入這些圖片,如下圖所示,可以看到,讀入了10幅右攝像頭的棋盤圖。

采集棋盤圖的時候要注意,盡量讓棋盤占據(jù)盡可能多的畫面,這樣可以得到更多有關(guān)攝像頭畸變方面的信息

2.2. 圖像basename讀入

2.3. 讀入的棋盤圖

然后再回到主控制界面,點擊Extract grid corners,提取每幅圖的角點

2.4. calib_gui面板

點擊完后,命令行會出現(xiàn)如下提示,主要是讓你輸入棋盤角點搜索窗口的大小。窗口定的大一點的話提取角點會比較方便點(即便點得偏離了也能找到),但也要注意不能大過一個方格的大小。剩下的兩個選項,只要回車選用默認(rèn)設(shè)置就可以了

2.5. 選擇窗口大小

然后就開始了角點的提取工作,按一定順序分別提取棋盤的最邊上的角點,程序會自動幫你找到所有對應(yīng)的角點

2.6. 提取角點

2.7. 提取角點2

在提取第一幅圖的時候命令行窗口可能會提示你輸入方格大小,這里輸入你方格的實際大小就行,比如我方格是27mm,就輸入27。這步事實上相當(dāng)關(guān)鍵,它定義了空間的尺度,如果要對物體進行測量的話,這步是必須的。

按相同的方法提取完10幅圖后,點擊Calibration,開始攝像頭標(biāo)定

2.8. calib_gui面板

經(jīng)過多次迭代后,程序會最終得到攝像頭的內(nèi)外參數(shù),如下圖所示(圖中符號由于字體關(guān)系沒有完全顯示,中間的問號是表示誤差的加減號)

2.9. Calibration迭代過程及結(jié)果

可以通過面板上的Show Extrinsic查看一下標(biāo)定結(jié)果,可以驗證一下標(biāo)定外參數(shù)的結(jié)果

2.10. 外部參數(shù)圖示

驗證標(biāo)定結(jié)果無誤之后,就點擊面板上的Save按鈕,程序會把標(biāo)定結(jié)果放在一個叫Calib_Result.mat中,為了方便后續(xù)立體標(biāo)定,把這個文件名改為Calib_Result_right.mat。

左攝像頭標(biāo)定的方法與右攝像頭相同,生成的Calib_Result.mat之后,將其改名為Calib_Result_left.mat就可以了

左右攝像頭都標(biāo)定完成之后,就可以開始立體標(biāo)定了。

在Matlab命令行中鍵入stereo_gui啟動立體標(biāo)定面板,如下圖所示

296ed786-c6f4-11ed-bfe3-dac502259ad0.jpg

2.11. stereo_gui面板

點擊Load left and right calibration files并在命令行中選擇默認(rèn)的文件名(Calib_Result_left.mat和Calib_Result_right.mat)之后就可以開始Run stereo calibration了,run之后的結(jié)果如下圖所示,左右攝像頭的參數(shù)都做了修正,并且也求出了兩個攝像頭之間的旋轉(zhuǎn)和平移關(guān)系向量(om和T)

2989d112-c6f4-11ed-bfe3-dac502259ad0.jpg

2.12. 立體標(biāo)定結(jié)果

在面板上點擊Show Extrinsics of stereo rig,可以看到如下圖所示的雙攝像頭關(guān)系圖,可以看到,兩個攝像頭基本是前向平行的

299fe72c-c6f4-11ed-bfe3-dac502259ad0.jpg

2.13. 雙攝像頭與定標(biāo)棋盤間的位置關(guān)系

得到了立體標(biāo)定參數(shù)之后,就可以把參數(shù)放入xml文件,然后用cvLoad讀入OpenCV了。具體的方法可以參照Learning OpenCV第11章的例子,上面就是用cvSave保存標(biāo)定結(jié)果,然后再用cvLoad把之前的標(biāo)定結(jié)果讀入矩陣的

29d3b638-c6f4-11ed-bfe3-dac502259ad0.jpg

2.14. xml文件示例

這里需要注意的是Matlab標(biāo)定結(jié)果中的om向量,這個向量是旋轉(zhuǎn)矩陣通過Rodrigues變換之后得出的結(jié)果,如果要在cvStereoRectify中使用的話,需要首先將這個向量用cvRodrigues轉(zhuǎn)換成旋轉(zhuǎn)矩陣。關(guān)于Rodrigues變換,Learning OpenCV的第11章也有說明。

29df9944-c6f4-11ed-bfe3-dac502259ad0.jpg

2.15. 旋轉(zhuǎn)矩陣的Rodrigues形式表示

3. 立體校準(zhǔn)和匹配

有了標(biāo)定參數(shù),校準(zhǔn)的過程就很簡單了。

我使用的是OpenCV中的cvStereoRectify,得出校準(zhǔn)參數(shù)之后用cvRemap來校準(zhǔn)輸入的左右圖像。這部分的代碼參考的是Learning OpenCV 十二章的例子。

校準(zhǔn)之后,就可以立體匹配了。立體匹配OpenCV里面有兩種方法,一種是Block Matching,一種是Graph Cut。Block Matching用的是SAD方法,速度比較快,但效果一般。Graph Cut可以參考Kolmogrov03的那篇博士論文,效果不錯,但是運行速度實在是慢到不能忍。所以還是選擇BM。

以下是我用BM進行立體匹配的參數(shù)設(shè)置

[cpp:nogutter]

BMState=cvCreateStereoBMState(CV_STEREO_BM_BASIC,0);

assert(BMState!=0);

BMState->preFilterSize=13;

BMState->preFilterCap=13;

BMState->SADWindowSize=19;

BMState->minDisparity=0;

BMState->numberOfDisparities=unitDisparity*16;

BMState->textureThreshold=10;

BMState->uniquenessRatio=20;

BMState->speckleWindowSize=13;

其中minDisparity這個參數(shù)我設(shè)置為0是由于我的兩個攝像頭是前向平行放置,相同的物體在左圖中一定比在右圖中偏右,如下圖3.1所示。所以沒有必要設(shè)置回搜的參數(shù)。

如果為了追求更大的雙目重合區(qū)域而將兩個攝像頭向內(nèi)偏轉(zhuǎn)的話,這個參數(shù)是需要考慮的。

29ee52ea-c6f4-11ed-bfe3-dac502259ad0.jpg

3.1. 校正后的左右視圖

另外需要提的參數(shù)是uniquenessRatio,實驗下來,我感覺這個參數(shù)對于最后的匹配結(jié)果是有很大的影響。uniquenessRatio主要可以防止誤匹配,其主要作用從下面三幅圖的disparity效果比對就可以看出。在立體匹配中,我們寧愿區(qū)域無法匹配,也不要誤匹配。如果有誤匹配的話,碰到障礙檢測這種應(yīng)用,就會很麻煩。

2a0d73b4-c6f4-11ed-bfe3-dac502259ad0.jpg

3.2. UniquenessRatio為0時的匹配圖,可以看到大片的誤匹配區(qū)域

2a2eafd4-c6f4-11ed-bfe3-dac502259ad0.jpg

3.3. UniquenessRatio為10時的disparity map, 可以看到誤匹配被大量減少了, 但還是有噪點

2a5125f0-c6f4-11ed-bfe3-dac502259ad0.jpg

3.4. UniquenessRatio為20時的disparity map, 可以看到誤匹配基本被去除了, 點云干凈了很多

關(guān)于cvFindStereoCorrespondenceBM這個函數(shù)的源代碼,曾經(jīng)做過比較詳細(xì)的研究,過一段時間也會把之前寫的代碼注釋整理一下,發(fā)篇博文。

4.實際距離的測量

在用cvFindStereoCorrespondenceBM得出disparity map之后,還需要通過cvReprojectImageTo3D這個函數(shù)將單通道Disparity Map轉(zhuǎn)換成三通道的實際坐標(biāo)矩陣。

具體的數(shù)學(xué)原理可以參考下面這個公式(from chenyusiyuanhttp://blog.csdn.net/chenyusiyuan/archive/2009/12/25/5072597.aspx,實際深度的一些問題這篇博文中也有提到)

2a6c7558-c6f4-11ed-bfe3-dac502259ad0.jpg

4.1 距離轉(zhuǎn)換公式

但是在實際操作過程中,用cvReprojectImageTo3D得到的數(shù)據(jù)并未如實際所想,生成深度矩陣所定義的世界坐標(biāo)系我就一直沒弄清楚。這在下面的例子中會詳細(xì)說明,希望這方面的專家能幫忙解答一下:

圖4.2是測量時的實際場景圖,場景中主要測量的三個物體就是最前面的利樂包裝盒、中間的紙杯、和最遠的塑料瓶。

2a7b378c-c6f4-11ed-bfe3-dac502259ad0.jpg

4.2. 實際場景中三個待測物體的位置

圖4.3是校準(zhǔn)后的左右圖和匹配出來的disparity map,disparity窗口中是實際的點云,object窗口是給disparity map加了個閾值之后得到的二值圖,主要是為了分割前景和背景??梢钥吹揭獪y的三個物體基本被正確地分割出來了

2a8afaaa-c6f4-11ed-bfe3-dac502259ad0.jpg

4.3. 雙目攝像頭得到的disparity map

圖4.4是在disparity窗口中選取一個點后然后在實際坐標(biāo)矩陣中得到的對應(yīng)三維信息,在這里,我在三個物體的點云上各選一個點來代表一個物體實際的坐標(biāo)信息。(這里通過鼠標(biāo)獲取一點坐標(biāo)信息的方法參考的是opencv sample里的watershed.cpp)

2ab0d676-c6f4-11ed-bfe3-dac502259ad0.jpg

4.4. 對應(yīng)點的三維坐標(biāo)

在這里可以看到,(265, 156)也就是利樂包裝盒的坐標(biāo)是(13, 12, -157),(137, 142)紙杯的坐標(biāo)是(77, 30, -312),(95, 115)塑料瓶的坐標(biāo)是(144, 63, -482)。

補充一下:為了方便顯示,所以視差圖出來之后進行了一個0-255的normalize,所以value值的前一個是normalize之后點的灰度值,后一個是normalize之前點的實際視差圖。

由cvFindStereoCorrespondenceBM算法的源代碼:

dptr[y*dstep] = (short)(((ndisp - mind - 1 + mindisp)*256 + (d != 0 ? (p-n)*128/d : 0) + 15) >> 4);

其中

ndisp是ndisp = state->numberOfDisparities;

mindisp是mindisp = state->minDisparity;

mind就是sad得出的視差

實際視差大約是(64-mind-1)*256=1163, 基本是對的, 后面一項修正值在通常情況下可以忽略

目前我還是不是很清楚立體坐標(biāo)系原點和尺度,但是從這三個點的z坐標(biāo)可以大致看出這三個物體的距離差大概是13,基本與實際場景中物體的位置一致。因此,可以通過這種方法確定出物體的大致距離信息。

但是,如果就從攝像頭參數(shù)本身來測量距離的話,就不是很明白了,還求這方面的大牛解答。

5. 一些問題

5.1 關(guān)于StereoCalibrate

OpenCV自帶的cvStereoCalibrate感覺不怎么好用,用這個函數(shù)求出的內(nèi)參外參和旋轉(zhuǎn)平移矩陣進行校準(zhǔn),往往無法達到行對準(zhǔn),有時甚至?xí)霈F(xiàn)比較可怕的畸變。在看了piao的http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4603帖子之后,也曾經(jīng)嘗試過現(xiàn)用cvCalibrateCamera2單獨標(biāo)定(左右各20幅圖),得出的結(jié)果基本和Matlab單獨標(biāo)定的相同,然后再在cvStereoCalibrate中將參數(shù)設(shè)成CV_CALIB_USE_INTRINSIC_GUESS,用來細(xì)化內(nèi)參數(shù)和畸變參數(shù),結(jié)果得出的標(biāo)定結(jié)果就又走樣了。

不知道有誰在這方面有過成功經(jīng)驗的,可以出來分享一下。畢竟用Matlab工具箱還是麻煩了些。

5.2Translation向量以及立體匹配得出的世界坐標(biāo)系

Learning OpenCV中對于Translation和Rotation的圖示是這樣的

2ad38572-c6f4-11ed-bfe3-dac502259ad0.jpg

5.1. Learning OpenCV中的圖示

可是在實驗過程中發(fā)現(xiàn),如果將Translation向量按尺度縮放,對于StereoRectify之后的左右視圖不會有變化,比如將T = [ -226.73817 -0.62302 8.93984 ] ,變成T = [ -22.673817 -0.062302 0.893984 ],在OpenCV中顯示的結(jié)果不會有任何變化。而且我如果修改其中的一個參量的話,左右視圖發(fā)生的變化也不是圖5.1中所示的那種變化(比如把x縮小,那么視圖發(fā)生的變化不是往x軸方向的平移)。

因此又回到了老問題,這里這些坐標(biāo)的尺度究竟是什么?通過ReprojectTo3D那個函數(shù)得到的三維坐標(biāo)又是以哪個點為原點,那三個方向為x,y,z軸的?

補充: 對這個問題的解答來自于和maxwellsdemon的討論

他的解釋如下:rotation是兩者的旋轉(zhuǎn)角度的關(guān)系,但是你要把它矯正平行,也是需要translation matrix的。你可以設(shè)想,兩個看似已經(jīng)平行了的攝像頭,但是深度上放置的有差距,那么在矯正的時候會議translation matrix所對應(yīng)的角度或者直線為基準(zhǔn),二者旋轉(zhuǎn)一個小角度,使得完全平行。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 攝像機
    +關(guān)注

    關(guān)注

    3

    文章

    1686

    瀏覽量

    61060
  • 面板
    +關(guān)注

    關(guān)注

    13

    文章

    1699

    瀏覽量

    54463
  • OpenCV
    +關(guān)注

    關(guān)注

    32

    文章

    642

    瀏覽量

    42426

原文標(biāo)題:攝像機標(biāo)定和立體標(biāo)定

文章出處:【微信號:機器視覺沙龍,微信公眾號:機器視覺沙龍】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    基于機器視覺的攝像機標(biāo)定理論與各種方法分析

    標(biāo)定參照物與算法思路可以分成若干類,如基于3D立體靶標(biāo)的攝像機標(biāo)定、基于2D平面靶標(biāo)的攝像機標(biāo)定
    發(fā)表于 06-04 08:00

    攝像機標(biāo)定理論是什么?其方法有哪些?

    攝像機標(biāo)定是什么?如何對攝像機標(biāo)定進行分類?傳統(tǒng)攝像機標(biāo)定方法分為哪些?
    發(fā)表于 04-13 06:10

    簡易攝像機標(biāo)定方法

    以簡化以往的攝像機標(biāo)定技術(shù)為研究目的,分析了標(biāo)定算法對于前期圖像處理的要求,給出了基于MATLAB 的簡易 攝像機 標(biāo)定方法。該方法借助于常
    發(fā)表于 06-13 15:52 ?39次下載
    簡易<b class='flag-5'>攝像機</b><b class='flag-5'>標(biāo)定</b>方法

    基于攝像機標(biāo)定的車輛速度檢測方法

    提出了基于平面單應(yīng)性矩陣的攝像機標(biāo)定算法,通過攝像機標(biāo)定對檢測區(qū)域進行網(wǎng)格劃分,從而進行車輛速度的檢測。經(jīng)實驗測試,該方法易于實現(xiàn),且具有較高的檢測精度,平均測速準(zhǔn)確率
    發(fā)表于 11-10 14:35 ?51次下載

    一種基于Tsai法的攝像機改進標(biāo)定

    提出了一種改進標(biāo)定法.該方法采用分步標(biāo)定的思想,以創(chuàng)建的平面模板為標(biāo)定物,利用共面點便可線性求解出攝像機的內(nèi)外參數(shù).建立的攝像機模型考慮了徑
    發(fā)表于 04-26 15:29 ?28次下載
    一種基于Tsai法的<b class='flag-5'>攝像機</b>改進<b class='flag-5'>標(biāo)定</b>法

    基于B-dual-space的攝像機標(biāo)定

    基于B-dual-space的攝像機標(biāo)定
    發(fā)表于 11-18 16:40 ?0次下載

    基于OpenCV的單目攝像機標(biāo)定

    本文CameraCalibrator類源代碼來自于OpenCV2 計算機視覺編程手冊(Robert Laganiere 著 張靜 譯) 強烈建議閱讀機器視覺學(xué)習(xí)筆記(4)——單目攝像機標(biāo)定參數(shù)
    發(fā)表于 02-08 03:36 ?947次閱讀

    基于OpenCV的雙目攝像機標(biāo)定

    )——單目攝像機標(biāo)定參數(shù)說明? 機器視覺學(xué)習(xí)筆記(5)——基于OpenCV的單目攝像機標(biāo)定? 機器視覺學(xué)習(xí)筆記(6)——雙目攝像機
    發(fā)表于 02-08 03:41 ?877次閱讀

    基于HALCON的雙目是相機立體視覺系統(tǒng)標(biāo)定

    攝像機標(biāo)定是機器視覺和攝像測量領(lǐng)域相對基礎(chǔ)的工作,同時也是最復(fù)雜、困難的T作。攝像機標(biāo)定的意義是得到立體
    發(fā)表于 11-06 14:41 ?30次下載
    基于HALCON的雙目是相機<b class='flag-5'>立體</b>視覺系統(tǒng)<b class='flag-5'>標(biāo)定</b>

    機器視覺中的攝像機標(biāo)定和自標(biāo)定分析

    的,這些幾何模型參數(shù)就是攝像機參數(shù)。在大多數(shù)條件下,這些參數(shù)必須通 過實驗與計算才能得到,這個過程被稱為攝像機定標(biāo)(或稱為標(biāo)定)。標(biāo)定過程就是確定
    發(fā)表于 11-17 17:53 ?1.5w次閱讀
    機器視覺中的<b class='flag-5'>攝像機</b><b class='flag-5'>標(biāo)定</b>和自<b class='flag-5'>標(biāo)定</b>分析

    基于梯形棋盤格標(biāo)定板對激光雷達和攝像機聯(lián)合標(biāo)定方法

    針對無人車(UGV)自主跟隨目標(biāo)車輛檢測過程中需要對激光雷達(LiDAR)數(shù)據(jù)和攝像機圖像進行信息融合的問題,提出了一種基于梯形棋盤格標(biāo)定板對激光雷達和攝像機進行聯(lián)合標(biāo)定的方法。首先,
    發(fā)表于 11-30 16:23 ?7次下載
    基于梯形棋盤格<b class='flag-5'>標(biāo)定</b>板對激光雷達和<b class='flag-5'>攝像機</b>聯(lián)合<b class='flag-5'>標(biāo)定</b>方法

    單幅二維圖像的攝像機標(biāo)定方法

    為提高場景攝像機標(biāo)定精度和標(biāo)定效率,本文利用攝像機透鏡成像原理,基于針孔成像模型,提出了一種基于單幅二維圖像的攝像機
    發(fā)表于 12-15 11:04 ?5次下載

    什么是相機標(biāo)定 常用相機標(biāo)定的方法

    對于攝像機標(biāo)定問題已提出了很多方法,攝像機標(biāo)定的理論問題已得到較好的解決,對攝像機標(biāo)定的研究來說
    發(fā)表于 08-04 12:54 ?3485次閱讀
    什么是相機<b class='flag-5'>標(biāo)定</b> 常用相機<b class='flag-5'>標(biāo)定</b>的方法

    機器視覺的攝像機標(biāo)定技術(shù)你知道多少?

    利用本質(zhì)矩陣和基本矩陣的攝像機標(biāo)定方法;利用主動系統(tǒng)控制攝像機作特定運動的自標(biāo)定方法(主動視覺標(biāo)定方法)。
    發(fā)表于 10-16 11:42 ?1156次閱讀
    機器視覺的<b class='flag-5'>攝像機</b><b class='flag-5'>標(biāo)定</b>技術(shù)你知道多少?

    機器視覺中攝像機標(biāo)定的目的是什么

    空間物體表面某點的三維幾何位置與其在圖像中對應(yīng)點之間的相互關(guān)系是由攝像機成像的幾何模型決定的,這些幾何模型參數(shù)就是攝像機參數(shù),為了得到這些參數(shù)而進行的實驗與計算的過程稱為攝像機標(biāo)定。
    發(fā)表于 11-03 11:07 ?1860次閱讀
    機器視覺中<b class='flag-5'>攝像機</b><b class='flag-5'>標(biāo)定</b>的目的是什么