使用 Ladybug 相機(jī)呈現(xiàn)的幾何視覺
相機(jī)系統(tǒng)的六個(gè)傳感器通過精確校準(zhǔn)傳感器的物理位置和方向以及鏡頭的失真模型,從而實(shí)現(xiàn)有效的圖像變形和圖像拼接。此校準(zhǔn)還能夠?qū)D像數(shù)據(jù)進(jìn)行攝影測(cè)量分析。本應(yīng)用說明描述了如何在相機(jī)坐標(biāo)系和單個(gè)傳感器之間進(jìn)行映射。
1 Ladybug 相機(jī)上的坐標(biāo)系
每個(gè)鏡頭都有自己的右手 3D 坐標(biāo)系。還有一個(gè)Ladybug 3D 坐標(biāo)系,它與整個(gè)相機(jī)相關(guān)聯(lián)。這使每個(gè) Ladybug 相機(jī)上總共有七個(gè) 3D 坐標(biāo)系。此外,每個(gè)傳感器都有一個(gè) 2D 像素網(wǎng)格坐標(biāo)系。
鏡頭 3D 坐標(biāo)系
六個(gè)鏡頭中每個(gè)鏡頭都有自己的右手 3D 坐標(biāo)系。
● 原點(diǎn)是鏡頭的光學(xué)中心
● Z 軸從傳感器指向場(chǎng)景–即光軸
● X 軸和 Y 軸相對(duì)于與該鏡頭相關(guān)的圖像傳感器的像素網(wǎng)格
● Y 軸指向圖像列。Y 軸正方向?yàn)樯蛐刑?hào)的方向。這從法線方向圖像的視點(diǎn)指向下方
● X 軸指向圖像行。X 軸正方向?yàn)樯蛄刑?hào)的方向。這指向法線方向圖像的右側(cè)
● 此坐標(biāo)系用于表示每個(gè)鏡頭/傳感器的視點(diǎn)的 3D 空間。其單位是米,而不是像素。
圖 1:3D 傳感器坐標(biāo)
傳感器 2D 坐標(biāo)系
每個(gè)傳感器都有自己的右手 3D 坐標(biāo)系。
● u 軸和 v 軸是基于圖像的校正后的圖像空間的 2D 圖像坐標(biāo)系,以像素為單位測(cè)量
● 坐標(biāo)系的原點(diǎn)位于光軸和校正后圖像平面的交點(diǎn)處,每個(gè)傳感器的坐標(biāo)系的原點(diǎn)都不同
● u 軸沿圖像傳感器行指向升序列號(hào)方向(即向右)
● v 軸沿列指向升序行號(hào)方向(即向下)。
圖 2:2D 傳感器坐標(biāo)
Ladybug 相機(jī)坐標(biāo)系
Ladybug 相機(jī)坐標(biāo)系位于 Ladybug 外殼的中心,由 6 個(gè)鏡頭坐標(biāo)系的位置決定。
原點(diǎn)是五個(gè)水平攝像頭原點(diǎn)的中心
Z 軸平行于頂部鏡頭的光軸(鏡頭 5)(*)
X 軸平行于鏡頭 0 的光軸 (*)
Y 軸與基于 X 軸和 Z 軸的右手坐標(biāo)系一致
LD2 – LD3 – LD5可能會(huì)有一些變化
(*) 注意 –由于裝配容差,鏡頭 5 和鏡頭 0 的光軸通常不會(huì)完全垂直。Ladybug 相機(jī)坐標(biāo)系的 X 軸經(jīng)過微調(diào),以確保它們垂直。
圖 3:全局坐標(biāo)
2 相對(duì)鏡頭坐標(biāo)系和 Ladybug 坐標(biāo)系
可從 Ladybug API 檢索每個(gè)鏡頭坐標(biāo)系相對(duì)于 Ladybug 坐標(biāo)系的位置。首先,使用 ladybuggeom.h 中定義的 ladybugGetCameraUnitExtrinsics() 檢索 3D 變換和歐拉角旋轉(zhuǎn)。
/**
* 獲取指定相機(jī)單元的 6-D 外參矢量。
*
* 6-D 外參矢量符合 EulerZYX 慣例(參見 Craig 的
*《機(jī)器人學(xué)導(dǎo)論》 第 45-49 頁)。外參分量的
* 順序?yàn)椋?/p>
*
* - 元素 0 - Rx - 繞 X 軸旋轉(zhuǎn)(弧度)
* - 元素 1 - Ry - 繞 Y 軸旋轉(zhuǎn)(弧度)
* - 元素 2 - Rz - 繞 Z 軸旋轉(zhuǎn)(弧度)
* - 元素 3 - Tx - 沿 X 軸平移(米)
* - 元素 4 - Ty - 沿 Y 軸平移(米)
* - 元素 5 - Tz - 沿 Z 軸平移(米)
*
* 所謂外參,意思是指對(duì)應(yīng)的 4x4 變換矩陣
* 允許將本地相機(jī)單元坐標(biāo)中的點(diǎn)映射到
* Ladybug 坐標(biāo)系中的坐標(biāo)。其中 s=sin,c=cos,矩陣的格式
* 如下所示。
*
* 示例:
* 要將其映射到 Craig 的矩陣中:
* - Rz = α
* - Ry = β
* - Rx = γ
*
* - |X'| |((cRz)(cRy)) ((cRz)(sRy)(sRx)-(sRz)(cRx)) ((cRz)(sRy)(cRx)+(sRz)(sRx)) Tx||X|
* - |Y'|=|((sRz)(cRy)) ((sRz)(sRy)(sRx)+(cRz)(cRx)) ((sRz)(sRy)(cRx)-(cRz)(sRx)) Ty||Y|
* - |Z'| |((-sRy)) ((cRy)(sRx)) ((cRy)(cRx))) Tz||Z|
* - |1 | |0 0 0 1 ||1|
*
* @param context - 要訪問的 LadybugContext。
* @param uiCamera - 感興趣的相機(jī)指數(shù)。
* @param ardEulerZYX - 返回的 6-D EulerZYX 外參矢量。
*
* @return A LadybugError 表示該函數(shù)成功。
*/
LADYBUGDLL_API LadybugError
ladybugGetCameraUnitExtrinsics(
LadybugContext context,
unsigned int uiCamera,
double ardEulerZYX[6] );
請(qǐng)注意,該函數(shù)注釋說明了如何將提供的歐拉角(Rx、Ry、Rz)和平移(Tx、Ty、Tz)轉(zhuǎn)換為 4x4 變換 T。使用標(biāo)準(zhǔn)齊次變換公式:
在適當(dāng)?shù)淖鴺?biāo)系中。
一旦獲得此齊次變換,它就可以用于計(jì)算 Ladybug 坐標(biāo)系中的鏡頭坐標(biāo)系原點(diǎn),或 Ladybug 坐標(biāo)系中鏡頭坐標(biāo)系的坐標(biāo)軸,反之亦然。
3 將像素位置轉(zhuǎn)換為 3D 射線
使用 Ladybug 相機(jī)進(jìn)行幾何視覺時(shí)的一個(gè)常見任務(wù)是將特定圖像中的像素位置解釋為 Ladybug 坐標(biāo)系中的 3D 射線。存在可以從中提取像素的各種圖像空間,例如球型、圓柱形、校正或原始圖像空間。鼓勵(lì)用戶將原始圖像用于此類應(yīng)用。原始圖像是唯一未重采樣的圖像,因此在查找或跟蹤圖像特征時(shí)可提供最佳精確度。
要將原始圖像中的像素位置轉(zhuǎn)換為 Ladybug 坐標(biāo)系中的 3D 射線,應(yīng)采取以下步驟:
1. 使用 ladybugGetCameraUnitFocalLength() 獲取相應(yīng)鏡頭的焦距
2. ladybugGetCameraUnitImageCenter() 獲取鏡頭的圖像中心
3. 使用 ladybugGetCameraUnitExtrinsics() 獲取相機(jī)的 6D 外參矢量(歐拉角和平移)
4. 使用 ladybugRectifyPixel() 校正 2D 像素位置
5. 查找此校正圖像位置的(u,v)像素坐標(biāo)
6. 將校正后的 2D 像素位置變換成本地相機(jī)坐標(biāo)系內(nèi)的 3D 射線
7. 在 Labybug 坐標(biāo)系中將局部 3D 射線轉(zhuǎn)換為 3D 射線
要從校正(列、行)圖像位置查找(u,v)像素位置,必須考慮圖像中心信息:
其中
等于像素行位置, 等于圖像中心行位置。
通過使用標(biāo)準(zhǔn)針孔相機(jī)模型解釋校正圖像,可以將校正圖像位置(u,v)轉(zhuǎn)換為局部 3D 射線值。請(qǐng)注意,為相機(jī)獲得的焦距和圖像中心以像素為單位,僅適用于指定相機(jī)的校正圖像。為了從經(jīng)校正的 2D 像素位置計(jì)算局部 3D 射線,Z 是任意的,并且可以設(shè)置為 1。然后應(yīng)用針孔模型方程,可以得出:
矢量 。要將此矢量轉(zhuǎn)換為 Ladybug 坐標(biāo)系,只需應(yīng)用第 1.5 節(jié)中所示的齊次變化的 3x3 旋轉(zhuǎn)分量:
其中 R 是 T 的左上角 3x3 子矩陣。此矢量的原點(diǎn)將是轉(zhuǎn)換為 Ladybug 相機(jī)坐標(biāo)系的局部坐標(biāo)系的原點(diǎn),或
4 將像素位置轉(zhuǎn)換為
鏡頭偏移校正的 3D 射線
由于每個(gè)鏡頭中心都與 Ladybug 坐標(biāo)系的中心有偏移,因此將 2D 原始像素映射到 3D 射線的過程很復(fù)雜。為了獲得最準(zhǔn)確的結(jié)果,射線必須同時(shí)具有起點(diǎn)和方向,而不僅僅是從 Ladybug 坐標(biāo)系中心發(fā)出的方向。
映射原始像素分兩個(gè)步驟進(jìn)行:
1. 將原始像素映射到其校正坐標(biāo) – API:ladybugRectifyPixel()
/**
* 將失真(原始)像素位置映射到校正圖像的
* 對(duì)應(yīng)點(diǎn)。
*
* 該函數(shù)必須在 ladybugSetOffScreenImageSize() 之后調(diào)用,
* 該函數(shù)設(shè)置校正圖像的分辨率。
*
* @param context - 要訪問的 LadybugContext。
* @param uiCamera - 此圖像對(duì)應(yīng)的相機(jī)指數(shù)。
* @param dDistortedRow - 要映射的失真(原始)像素的行坐標(biāo)。
* @param dDistortedCol - 要映射的失真(原始)像素的列坐標(biāo)。
* @param pdRectifiedRow - 返回校正圖像中同一點(diǎn)
* 行坐標(biāo)的位置。
* @param pdRectifiedCol - 返回校正圖像中同一點(diǎn)
* 列坐標(biāo)的位置。
*
* @return A LadybugError 表示該函數(shù)成功。
* 如果任何通道所選區(qū)域的
* 平均強(qiáng)度超過 254/255,則返回 LADYBUG_OVEREXPOSED。
*
* @see ladybugSetOffScreenImageSize()
*/
LADYBUGDLL_API LadybugError
ladybugRectifyPixel(
LadybugContext context,
unsigned int uiCamera,
double dDistortedRow,
double dDistortedCol,
double* pdRectifiedRow,
double* pdRectifiedCol
2. 將校正后的坐標(biāo)映射到射線位置和方向 – API:ladybugRCtoXYZ()
/**
* 將特定相機(jī)單元上的 2D 點(diǎn)投影到 Ladybug 坐標(biāo)系中的
* 3D 射線中。射線被定義為其起點(diǎn)和方向。
* 起點(diǎn)考慮相機(jī)單元與
* ladybug 相機(jī)中心偏移,這使得在不同于拼接半徑的距離處
* 精確投影射線。
*
* @param context - 要訪問的 LadybugContext。
* @param dRectifiedRow - 2D 輸入點(diǎn)的校正行。
* @param dRectifiedCol - 2D 輸入點(diǎn)的校正列。
* @param uiCamera - 相機(jī)單元。
* @param pdLocationX - 輸出射線位置 x 分量。
* @param pdLocationY - 輸出射線位置 y 分量。
* @param pdLocationZ - 輸出射線位置 z 分量。
* @param pdDirectionX - 輸出射線方向 x 分量。
* @param pdDirectionY - 輸出射線方向 y 分量。
* @param pdDirectionZ - 輸出射線方向 z 分量。
*
* @return A LadybugError 表示該函數(shù)成功。
*/
LADYBUGDLL_API LadybugError
ladybugRCtoXYZ(
LadybugContext context,
double dRectifiedRow,
double dRectifiedCol,
unsigned int uiCamera,
double* pdLocationX,
double* pdLocationY,
double* pdLocationZ,
double* pdDirectionX,
double* pdDirectionY,
double* pdDirectionZ);
該映射類型的示例代碼以及其他不嚴(yán)重依賴 API 功能的映射類型,可在 Ladybug SDK 隨附的 ladybugTranslate2dTo3d 示例中獲得。
5 將 3D 點(diǎn)轉(zhuǎn)換為像素位置
將第 1.6 和 1.7 節(jié)中描述的像素轉(zhuǎn)換為 3D 問題略微復(fù)雜,因?yàn)樾枰紫日业?3D 點(diǎn)將投影到哪個(gè)鏡頭中。否則,可以直接使用函數(shù) ladybugXYZtoRC() 完成。函數(shù)頭信息如下所示。
/**
* 將 3D 點(diǎn)(相對(duì)于 Ladybug 坐標(biāo)系)投影到
* 指示的相機(jī)單元,并返回其將位于其校正圖像的
* 位置。
*
* @param context - 要訪問的 LadybugContext。
* @param dLadybugX - 要投影的點(diǎn)的 X 坐標(biāo)。
* @param dLadybugY - 要投影的點(diǎn)的 Y 坐標(biāo)。
* @param dLadybugZ - 要投影的點(diǎn)的 Z 坐標(biāo)。
* @param uiCamera - 此圖像對(duì)應(yīng)的相機(jī)指數(shù)。
* @param pdRectifiedRow - 返回的 3D 點(diǎn)所在的校正行位置
* (如果該點(diǎn)為投影到校正圖像,
* 則將則小于 0)。
* @param pdRectifiedCol - 返回的 3D 點(diǎn)所在的校正列位置
* (如果該點(diǎn)為投影到校正圖像,
* 則將則小于 0)。
* @param pdNormalized - 從校正像素到焦點(diǎn)中心的距離
* 以焦距為標(biāo)準(zhǔn)。如果調(diào)用者對(duì)此值不感興趣,
* 可設(shè)置為 NULL。
*
* @return A LadybugError 表示該函數(shù)成功。
*/
LADYBUGDLL_API LadybugError
ladybugXYZtoRC(
LadybugContext context,
double dLadybugX,
double dLadybugY,
double dLadybugZ,
unsigned int uiCamera,
double* pdRectifiedRow,
double* pdRectifiedCol,
double* pdNormalized);
為了確定一個(gè) 3D 點(diǎn)將投影到哪個(gè)鏡頭中,該函數(shù)可用于 6 個(gè)鏡頭位置中的每一個(gè)(通過適當(dāng)設(shè)置 uiCamera 參數(shù))。如果返回代碼成功 (LADYBUG_OK),則由 dLadybugX、Y 和 Z 定義的 3D 點(diǎn)就會(huì)投影到相機(jī) uiCamera 中的 pdRectifiedRow 和 pdRectifiedCol 提供的校正行和列位置。可以使用 ladybugUnrectifypPixel 來確定原始圖像中像素的位置。
6 校準(zhǔn)精確度
Ladybug 相機(jī)的平均精確度在 10 m 距離為 2 mm,即 0.0116 度,如下圖所示。
局部到 Ladybug 轉(zhuǎn)換誤差
相對(duì)于 Ladybug 相機(jī)坐標(biāo)系,數(shù)學(xué)模型與鏡頭的實(shí)際位置和方向匹配程度存在誤差。這與實(shí)際物理位置與相機(jī)校準(zhǔn)期間計(jì)算的位置之間的差異有關(guān)。
這與以下方面有關(guān):
● 相對(duì)鏡頭坐標(biāo)系和 Ladybug 坐標(biāo)系
● 將 3D 點(diǎn)轉(zhuǎn)換為像素位置
校正誤差
數(shù)學(xué)模型與潛在的鏡頭失真的匹配程度存在誤差。
這與以下方面有關(guān):
● 將像素位置轉(zhuǎn)換為 3D 射線
● 將 3D 點(diǎn)轉(zhuǎn)換為像素位置
相機(jī)中心視差誤差
視差誤差是額外的誤差來源,不包括在上述 10 米距離為 2 毫米的精確度內(nèi)。
視差誤差是從兩個(gè)不同的起始位置指向同一目的地的兩條射線之間的差異。在這種情況下,位置差異在鏡頭中心和相機(jī)坐標(biāo)中心之間。
下圖顯示了在鏡頭中心位于實(shí)際位置和透鏡中心位于 Ladybug 坐標(biāo)系中心之間時(shí)。觀察 3D 空間中同一點(diǎn)的角度差。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。