zemax设置 像方远心_ZEMAX相机标定非常不完全指南
ZEMAX是廣為使用的一款光學仿真軟件,是進行光路設計和分析的利器;而相機標定,則是進行機器視覺任務時,拿到一款相機,對其實際參數進行確定的過程。
因此看起來,二者其實主要是針對不同的側重點。前者主要面向相機開發,后者面向相機使用。
但是最近遇到了一個問題,不得不使用ZEMAX進行一些相機標定算法方面的驗證。這期間遇到了一些問題,這里記錄下來希望可以與大家分享,如有不對之處進請指正。
事情的經過是這樣的:現在手頭有一臺特殊光路的相機,由于相機是課題組自己設計搭建,因此也有相應的ZEMAX工程文件。在理想情況下該相機與普通相機的成像模型完全一致,因此理論上可以使用張正義相機標定法進行標定。
然而,相機光路中包含一些特殊結構的光學元件,這些元件的安裝與制造誤差勢必會為成像系統引入畸變,因此有必要為這些畸變和誤差建立對應的數學模型,就類似于普通相機中的徑向畸變與切向畸變模型,從而對其進行矯正。所以問題來了,怎么驗證模型的可靠性呢?
仿真!
我的想法是這樣的。在ZEMAX中對一些光學元件的角度進行一些微調,以此來模擬實際情況中的安裝誤差;接著在ZEMAX中模仿張正義標定法,在物方視場中設置類似棋盤格的視場:
令成像系統在不同的位置與角度對物面成像,記錄對應的像點。如此則得到了多組物點-像點的對應關系,接著使用張正義標定法再加上自己建立的誤差模型對其進行標定,以此來驗證自己的誤差模型是否準確可靠。
OK,但是實際操作中,比較麻煩的地方就是“令成像系統在不同的位置與角度對物面成像”。下面就進入正題,說說我是怎么達到這個目的的。
一.旋轉光學系統
當光路與視場都設定好之后,此時的3D視圖是這樣的:
(吐槽一下,ZEMAX2017以后雖然最多可以設置超過2000個視場,但是只顯示12個,如果視場中有48個視場點,需要重復設置4次才能完成所有成像)
進行相機標定的時候,我們需要在不同角度進行拍攝,因此首先想到的辦法是旋轉光學系統。
所以首先在物面之后添加坐標間斷,設置旋轉參數。
然后就成了這個樣子:
光線進入了成像系統,但是卻沒有穿過后續的元件。
這里有一個辦法或許能解決這個問題:
打開系統選項中的光線瞄準,這時:
可以看到光線已經按照光軸進行了偏折,接著調整坐標間斷中的偏心參數,令所有光線進入即可。
如果能順利進行到這里的話,就已經大功告成了。但是我實際中遇到的問題是,當光路結構比較復雜的時候,在開啟光線瞄準的情況下,輸入傾斜角度經常會提示:
而且由于光線瞄準是軟件進行迭代求解,如果一次輸入大角度,同樣也會提示上述錯誤。比如直接輸入30°就會報錯,但是連續輸入10°、20°、30°可能就沒有問題。
在我的光學結構中,即使輸入很小的傾斜角度就會報錯,因此上述方法無法使用
二.旋轉物面
山不走來,那就走向山;既然旋轉光學系統不行,那旋轉物面呢?
ZEMAX中,物面可以設置為傾斜面,可以輸入正切值改變物面的角度。
比如輸入Y正切為2:
看起來好像不錯的樣子,但問題是,物面中各個視場之間的關系已經與之前不再相同了,之前我們設置視場的時候,是為每一個視場設定了一個平面坐標,但是旋轉之后,雖然各個視場點仍在一個平面上,但是彼此之間的距離已經與之前不同了。
此時每個物面中的點,都成為一個三維點,x、y坐標是我們提前設置的,Z坐標為:
如果用這種方法進行相機標定,就類似于實際進行相機標定時,不同角度下拍攝不同的標定板。
但是仔細想想,張正義標定法中其實并沒有限定標定板必須統一啊,拍一張換一個標定板也可以啊,只要確定標定板的尺寸和對應的像點就可以嘍。
于是接下來的問題轉換為:三維空間平面中的三維坐標,怎么轉化成該平面二維坐標?
我的做法是這樣的:
根據上述方程,顯然這個平面的法向量是(tanθx,tanθy,-1)。
顯然(1,0,tanθx)也在該平面上,對上述兩個向量進行模為1的操作后,再進行叉乘得到了第三個向量。
這三個向量組成了旋轉后平面的一組正交基。對這三個向量組成的矩陣取逆,就得到了原始物面與旋轉之后物面的轉換關系。
將該逆矩陣與三維空間平面中的三維坐標相乘,就得到了對應的平面二維坐標(其實也是三維坐標,只是最后一個維度數值為0)。
再結合該平面每個視場對應的像點,就可以進行標定了。
值得注意的是,MATLAB中相機標定函數中的世界坐標是固定的,但是我們這里相當于每張照片都不同,因此相應的標定代碼需要進行一些修改,才可以完成相機標定。
總結
以上是生活随笔為你收集整理的zemax设置 像方远心_ZEMAX相机标定非常不完全指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 考勤管理系统c语言,C语言课程设计学生考
- 下一篇: python查询斐波那契数列通项公式_斐