• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 博客專欄

    EEPW首頁 > 博客 > 使用 Ladybug 相機呈現的幾何視覺

    使用 Ladybug 相機呈現的幾何視覺

    發布人:12345zhi 時間:2023-07-27 來源:工程師 發布文章

    相機系統的六個傳感器通過精確校準傳感器的物理位置和方向以及鏡頭的失真模型,從而實現有效的圖像變形和圖像拼接。此校準還能夠對圖像數據進行攝影測量分析。本應用說明描述了如何在相機坐標系和單個傳感器之間進行映射。

    1  Ladybug 相機上的坐標系

    每個鏡頭都有自己的右手 3D 坐標系。還有一個Ladybug 3D 坐標系,它與整個相機相關聯。這使每個 Ladybug 相機上總共有七個 3D 坐標系。此外,每個傳感器都有一個 2D 像素網格坐標系。

    鏡頭 3D 坐標系

    六個鏡頭中每個鏡頭都有自己的右手 3D 坐標系。

    ● 原點是鏡頭的光學中心

    ● Z 軸從傳感器指向場景–即光軸

    ● X 軸和 Y 軸相對于與該鏡頭相關的圖像傳感器的像素網格

    ● Y 軸指向圖像列。Y 軸正方向為升序行號的方向。這從法線方向圖像的視點指向下方

    ● X 軸指向圖像行。X 軸正方向為升序列號的方向。這指向法線方向圖像的右側

    ● 此坐標系用于表示每個鏡頭/傳感器的視點的 3D 空間。其單位是米,而不是像素。

    圖片

    圖 1:3D 傳感器坐標

    傳感器 2D 坐標系

    每個傳感器都有自己的右手 3D 坐標系。

    ● u 軸和 v 軸是基于圖像的校正后的圖像空間的 2D 圖像坐標系,以像素為單位測量

    ● 坐標系的原點位于光軸和校正后圖像平面的交點處,每個傳感器的坐標系的原點都不同

    ● u 軸沿圖像傳感器行指向升序列號方向(即向右)

    ● v 軸沿列指向升序行號方向(即向下)。

    圖片

    圖 2:2D 傳感器坐標

    Ladybug 相機坐標系

    Ladybug 相機坐標系位于 Ladybug 外殼的中心,由 6 個鏡頭坐標系的位置決定。

    原點是五個水平攝像頭原點的中心

    Z 軸平行于頂部鏡頭的光軸(鏡頭 5)(*)

    X 軸平行于鏡頭 0 的光軸 (*)

    Y 軸與基于 X 軸和 Z 軸的右手坐標系一致

    LD2 – LD3 – LD5可能會有一些變化

    (*) 注意 –由于裝配容差,鏡頭 5 和鏡頭 0 的光軸通常不會完全垂直。Ladybug 相機坐標系的 X 軸經過微調,以確保它們垂直。

    圖片

    圖 3:全局坐標

    2  相對鏡頭坐標系和 Ladybug 坐標系

    可從 Ladybug API 檢索每個鏡頭坐標系相對于 Ladybug 坐標系的位置。首先,使用 ladybuggeom.h 中定義的 ladybugGetCameraUnitExtrinsics() 檢索 3D 變換和歐拉角旋轉。

    /**

    * 獲取指定相機單元的 6-D 外參矢量。

    *

    * 6-D 外參矢量符合 EulerZYX 慣例(參見 Craig 的

    *《機器人學導論》 第 45-49 頁)。外參分量的

    * 順序為:

    *

    * - 元素 0 - Rx - 繞 X 軸旋轉(弧度)

    * - 元素 1 - Ry - 繞 Y 軸旋轉(弧度)

    * - 元素 2 - Rz - 繞 Z 軸旋轉(弧度)

    * - 元素 3 - Tx - 沿 X 軸平移(米)

    * - 元素 4 - Ty - 沿 Y 軸平移(米)

    * - 元素 5 - Tz - 沿 Z 軸平移(米)

    *

    * 所謂外參,意思是指對應的 4x4 變換矩陣

    * 允許將本地相機單元坐標中的點映射到

    * Ladybug 坐標系中的坐標。其中 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 - 感興趣的相機指數。

    * @param ardEulerZYX - 返回的 6-D EulerZYX 外參矢量。

    *

    * @return A LadybugError 表示該函數成功。

    */

    LADYBUGDLL_API LadybugError

    ladybugGetCameraUnitExtrinsics(

    LadybugContext context,

    unsigned int uiCamera,

    double ardEulerZYX[6] );

    請注意,該函數注釋說明了如何將提供的歐拉角(Rx、Ry、Rz)和平移(Tx、Ty、Tz)轉換為 4x4 變換 T。使用標準齊次變換公式:

    圖片

    圖片

    在適當的坐標系中。

    一旦獲得此齊次變換,它就可以用于計算 Ladybug 坐標系中的鏡頭坐標系原點,或 Ladybug 坐標系中鏡頭坐標系的坐標軸,反之亦然。

    3  將像素位置轉換為 3D 射線

    使用 Ladybug 相機進行幾何視覺時的一個常見任務是將特定圖像中的像素位置解釋為 Ladybug 坐標系中的 3D 射線。存在可以從中提取像素的各種圖像空間,例如球型、圓柱形、校正或原始圖像空間。鼓勵用戶將原始圖像用于此類應用。原始圖像是唯一未重采樣的圖像,因此在查找或跟蹤圖像特征時可提供最佳精確度。

    要將原始圖像中的像素位置轉換為 Ladybug 坐標系中的 3D 射線,應采取以下步驟:

    1. 使用 ladybugGetCameraUnitFocalLength() 獲取相應鏡頭的焦距

    2. ladybugGetCameraUnitImageCenter() 獲取鏡頭的圖像中心

    3. 使用 ladybugGetCameraUnitExtrinsics() 獲取相機的 6D 外參矢量(歐拉角和平移)

    4. 使用 ladybugRectifyPixel() 校正 2D 像素位置

    5. 查找此校正圖像位置的(u,v)像素坐標

    6. 將校正后的 2D 像素位置變換成本地相機坐標系內的 3D 射線

    7. 在 Labybug 坐標系中將局部 3D 射線轉換為 3D 射線

    要從校正(列、行)圖像位置查找(u,v)像素位置,必須考慮圖像中心信息:

    圖片

    圖片

    其中

    圖片

    等于像素行位置, 等于圖像中心行位置。

    通過使用標準針孔相機模型解釋校正圖像,可以將校正圖像位置(u,v)轉換為局部 3D 射線值。請注意,為相機獲得的焦距和圖像中心以像素為單位,僅適用于指定相機的校正圖像。為了從經校正的 2D 像素位置計算局部 3D 射線,Z 是任意的,并且可以設置為 1。然后應用針孔模型方程,可以得出:

    圖片

    圖片

    圖片

    矢量 。要將此矢量轉換為 Ladybug 坐標系,只需應用第 1.5 節中所示的齊次變化的 3x3 旋轉分量:

    圖片

    其中 R 是 T 的左上角 3x3 子矩陣。此矢量的原點將是轉換為 Ladybug 相機坐標系的局部坐標系的原點,或

    圖片

    4  將像素位置轉換為

    鏡頭偏移校正的 3D 射線

    由于每個鏡頭中心都與 Ladybug 坐標系的中心有偏移,因此將 2D 原始像素映射到 3D 射線的過程很復雜。為了獲得最準確的結果,射線必須同時具有起點和方向,而不僅僅是從 Ladybug 坐標系中心發出的方向。

    映射原始像素分兩個步驟進行:

    1. 將原始像素映射到其校正坐標 – API:ladybugRectifyPixel()

    /**

    * 將失真(原始)像素位置映射到校正圖像的

    * 對應點。

    *

    * 該函數必須在 ladybugSetOffScreenImageSize() 之后調用,

    * 該函數設置校正圖像的分辨率。

    *

    * @param context - 要訪問的 LadybugContext。

    * @param uiCamera - 此圖像對應的相機指數。

    * @param dDistortedRow - 要映射的失真(原始)像素的行坐標。

    * @param dDistortedCol - 要映射的失真(原始)像素的列坐標。

    * @param pdRectifiedRow - 返回校正圖像中同一點

    * 行坐標的位置。

    * @param pdRectifiedCol - 返回校正圖像中同一點

    * 列坐標的位置。

    *

    * @return A LadybugError 表示該函數成功。

    * 如果任何通道所選區域的

    * 平均強度超過 254/255,則返回 LADYBUG_OVEREXPOSED。

    *

    * @see ladybugSetOffScreenImageSize()

    */

    LADYBUGDLL_API LadybugError

    ladybugRectifyPixel(

    LadybugContext context,

    unsigned int uiCamera,

    double dDistortedRow,

    double dDistortedCol,

    double* pdRectifiedRow,

    double* pdRectifiedCol

    2. 將校正后的坐標映射到射線位置和方向 – API:ladybugRCtoXYZ()

    /**

    * 將特定相機單元上的 2D 點投影到 Ladybug 坐標系中的

    * 3D 射線中。射線被定義為其起點和方向。

    * 起點考慮相機單元與

    * ladybug 相機中心偏移,這使得在不同于拼接半徑的距離處

    * 精確投影射線。

    *

    * @param context - 要訪問的 LadybugContext。

    * @param dRectifiedRow - 2D 輸入點的校正行。

    * @param dRectifiedCol - 2D 輸入點的校正列。

    * @param uiCamera - 相機單元。

    * @param pdLocationX - 輸出射線位置 x 分量。

    * @param pdLocationY - 輸出射線位置 y 分量。

    * @param pdLocationZ - 輸出射線位置 z 分量。

    * @param pdDirectionX - 輸出射線方向 x 分量。

    * @param pdDirectionY - 輸出射線方向 y 分量。

    * @param pdDirectionZ - 輸出射線方向 z 分量。

    *

    * @return A LadybugError 表示該函數成功。

    */

    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);

    該映射類型的示例代碼以及其他不嚴重依賴 API 功能的映射類型,可在 Ladybug SDK 隨附的 ladybugTranslate2dTo3d 示例中獲得。

    5  將 3D 點轉換為像素位置

    將第 1.6 和 1.7 節中描述的像素轉換為 3D 問題略微復雜,因為需要首先找到 3D 點將投影到哪個鏡頭中。否則,可以直接使用函數 ladybugXYZtoRC() 完成。函數頭信息如下所示。

    /**

    * 將 3D 點(相對于 Ladybug 坐標系)投影到

    * 指示的相機單元,并返回其將位于其校正圖像的

    * 位置。

    *

    * @param context - 要訪問的 LadybugContext。

    * @param dLadybugX - 要投影的點的 X 坐標。

    * @param dLadybugY - 要投影的點的 Y 坐標。

    * @param dLadybugZ - 要投影的點的 Z 坐標。

    * @param uiCamera - 此圖像對應的相機指數。

    * @param pdRectifiedRow - 返回的 3D 點所在的校正行位置

    * (如果該點為投影到校正圖像,

    * 則將則小于 0)。

    * @param pdRectifiedCol - 返回的 3D 點所在的校正列位置

    * (如果該點為投影到校正圖像,

    * 則將則小于 0)。

    * @param pdNormalized - 從校正像素到焦點中心的距離

    * 以焦距為標準。如果調用者對此值不感興趣,

    * 可設置為 NULL。

    *

    * @return A LadybugError 表示該函數成功。

    */

    LADYBUGDLL_API LadybugError

    ladybugXYZtoRC(

    LadybugContext context,

    double dLadybugX,

    double dLadybugY,

    double dLadybugZ,

    unsigned int uiCamera,

    double* pdRectifiedRow,

    double* pdRectifiedCol,

    double* pdNormalized);

    為了確定一個 3D 點將投影到哪個鏡頭中,該函數可用于 6 個鏡頭位置中的每一個(通過適當設置 uiCamera 參數)。如果返回代碼成功 (LADYBUG_OK),則由 dLadybugX、Y 和 Z 定義的 3D 點就會投影到相機 uiCamera 中的 pdRectifiedRow 和 pdRectifiedCol 提供的校正行和列位置??梢允褂?ladybugUnrectifypPixel 來確定原始圖像中像素的位置。

    6  校準精確度

    Ladybug 相機的平均精確度在 10 m 距離為 2 mm,即 0.0116 度,如下圖所示。

    圖片

    局部到 Ladybug 轉換誤差

    相對于 Ladybug 相機坐標系,數學模型與鏡頭的實際位置和方向匹配程度存在誤差。這與實際物理位置與相機校準期間計算的位置之間的差異有關。

    這與以下方面有關:

    ● 相對鏡頭坐標系和 Ladybug 坐標系

    ● 將 3D 點轉換為像素位置

    校正誤差

    數學模型與潛在的鏡頭失真的匹配程度存在誤差。

    這與以下方面有關:

    ● 將像素位置轉換為 3D 射線

    ● 將 3D 點轉換為像素位置

    相機中心視差誤差

    視差誤差是額外的誤差來源,不包括在上述 10 米距離為 2 毫米的精確度內。

    視差誤差是從兩個不同的起始位置指向同一目的地的兩條射線之間的差異。在這種情況下,位置差異在鏡頭中心和相機坐標中心之間。

    下圖顯示了在鏡頭中心位于實際位置和透鏡中心位于 Ladybug 坐標系中心之間時。觀察 3D 空間中同一點的角度差。

    圖片

    圖片

    圖片

    圖片

    *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



    關鍵詞: Ladybug 相機

    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 清水河县| 缙云县| 信宜市| 连江县| 通辽市| 光泽县| 泸西县| 万全县| 古浪县| 通化县| 农安县| 西林县| 灵石县| 平江县| 德钦县| 高唐县| 土默特右旗| 洱源县| 淅川县| 辉南县| 遵义市| 香港 | 白城市| 大新县| 三台县| 龙海市| 延川县| 赤壁市| 锡林浩特市| 锦州市| 慈溪市| 通许县| 眉山市| 合江县| 旬邑县| 神池县| 崇礼县| 石嘴山市| 东阿县| 海晏县| 安乡县|