<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          相機(jī)校準(zhǔn)—外參矩陣

          共 7042字,需瀏覽 15分鐘

           ·

          2022-12-30 21:52

          點(diǎn)擊上方小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)


          在本文中,我們將探討攝影機(jī)的外參,并通過(guò)Python中的一個(gè)實(shí)踐示例來(lái)加強(qiáng)我們的理解。

          相機(jī)外參

          攝像頭可以位于世界任何地方,并且可以指向任何方向。我們想從攝像機(jī)的角度來(lái)觀察世界上的物體,這種從世界坐標(biāo)系到攝像機(jī)坐標(biāo)系的轉(zhuǎn)換被稱(chēng)為攝像機(jī)外參。



          那么,我們?cè)鯓硬拍苷业较鄼C(jī)外參呢?一旦我們弄清楚相機(jī)是如何變換的,我們就可以找到從世界坐標(biāo)系到相機(jī)坐標(biāo)系的基變換的變化。我們將詳細(xì)探討這個(gè)想法。
          具體來(lái)說(shuō),我們需要知道相機(jī)是如何定位的,以及它在世界空間中的位置,有兩種轉(zhuǎn)換可以幫助我們:
          • 有助于確定攝影機(jī)方向的旋轉(zhuǎn)變換。
          • 有助于移動(dòng)相機(jī)的平移變換。
          讓我們?cè)敿?xì)看看每一個(gè)。

          旋轉(zhuǎn)

          通過(guò)旋轉(zhuǎn)改變坐標(biāo)

          讓我們看一下將點(diǎn)旋轉(zhuǎn)一個(gè)角度的變換。讓我們舉一個(gè)在?2的簡(jiǎn)單例子,對(duì)點(diǎn)??逆時(shí)針旋轉(zhuǎn)角度?? 得到點(diǎn)??′, 如下圖所示:



          ??的坐標(biāo)是(??,??) 以及??′的坐標(biāo)是(??′,??′). 我們需要找到(??′,??′).
          從圖來(lái)看,
          sinα = y/r , cosα = x/r ? [1]
          ? xsinα = ycosα ? [2]
          同樣的, x′ = rcos(θ+α)
          ? x′ = (x/cosα) ? cos(θ+α) (from [1])
          但, cos(θ+α) = cosθcosα ? sinθsinα
          ? x′ = (x/cosα) ? (cosθcosα ? sinθsinα)
          ? x′ = xcosθ ? xsinα ? (sinθ / cosα)
          ? x′ = xcosθ ? ycosα ? (sinθ / cosα) (from [2])
          ? x′ = xcosθ ? ysinθ

          同樣地,
          y′ = rsin(θ+α)
          ? y′ = (y/sinα) ? sin(θ+α) (from [1])
          但, sin(θ+α) = sinθcosα + cosθsinα
          ? y′ = (y/sinα) ? (sinθcosα + cosθsinα)
          ? y′ = ycosθ + ycosα ? (sinθ / sinα)
          ? y′ = ycosθ + xsinα ? (sinθ / sinα) (from [2])
          ? y′ = ycosθ + xsinθ
          ? y′ = xsinθ + ycosθ

          因此我們有,
          x′ = xcosθ ? ysinθ
          y′ = xsinθ + ycosθ
          旋轉(zhuǎn)是一種線(xiàn)性運(yùn)算,上述方程可以表示為矩陣乘法:

          這個(gè)操作是一個(gè)線(xiàn)性變換。

          擴(kuò)展到R3

          我們可以很容易地將旋轉(zhuǎn)變換擴(kuò)展到??3. 旋轉(zhuǎn)的變換矩陣??關(guān)于標(biāo)準(zhǔn)X軸、Y軸和Z軸,如下所示:
          繞Z軸旋轉(zhuǎn):

          繞X軸旋轉(zhuǎn):

          繞Y軸旋轉(zhuǎn):

          內(nèi)參旋轉(zhuǎn)與外參旋轉(zhuǎn)

          上述變換圍繞標(biāo)準(zhǔn)軸執(zhí)行旋轉(zhuǎn)。軸將隨時(shí)固定。這就是所謂的外參旋轉(zhuǎn)。還有另一種類(lèi)型的旋轉(zhuǎn)稱(chēng)為內(nèi)參旋轉(zhuǎn),我們?cè)诿恳徊蕉紘@其相對(duì)軸旋轉(zhuǎn)對(duì)象,如下所示:

          內(nèi)參旋轉(zhuǎn)很難用歐幾里德代數(shù)來(lái)實(shí)現(xiàn),我們將堅(jiān)持外參旋轉(zhuǎn)。

          基變換

          在基變換中,我們的目標(biāo)是在新的基上找到點(diǎn)的坐標(biāo)。
          在下面的示例中???? 軸已經(jīng)旋轉(zhuǎn)了一個(gè)角度?? 得到??′??′. 給定在原有XY軸下點(diǎn)??的坐標(biāo) , 我們的目標(biāo)是找到在新軸??′??′下點(diǎn)??的坐標(biāo) .



          XY下點(diǎn)P的坐標(biāo)是(x,y) ,新軸X'Y'下是(??′, ??′). 我們的目標(biāo)是找到(??′, ??′).
          從這個(gè)圖來(lái)看,
          sinα = y′/r , cosα = x′/r ? [1]
          ? x′sinα = y′cosα ? [2]
          同樣, x = rcos(θ+α)
          ? x = (x′/cosα) ? cos(θ+α) (from [1])
          但, cos(θ+α) = cosθcosα ? sinθsinα
          ? x = (x′ / cosα) ? (cosθcosα ? sinθsinα)
          ? x = x′cosθ ? xsinα ? (sinθ / cosα)
          ? x = x′cosθ ? y′cosα ? (sinθ / cosα) (from [2])
          ? x = x′cosθ ? y′sinθ

          同樣地,
          y = rsin(θ+α)
          ? y = (y′/sinα) ? sin(θ+α) (from [1])
          但, sin(θ+α) = sinθcosα + cosθsinα
          ? y = (y′/sinα) ? (sinθcosα + cosθsinα)
          ? y = y′cosθ + y′cosα ? (sinθ / sinα)
          ? y = y′cosθ + x′sinα ? (sinθ / sinα) (from [2])
          ? y = y′cosθ + x′sinθ
          ? y = x′sinθ + y′cosθ

          因此我們有,
          x = x′cosθ ? y′sinθ
          y = x′sinθ + y′cosθ
          上述方程式可以矩陣形式表示為:

          我們的目標(biāo)是找到(??′,??′). 因此,我們將矩陣移到另一側(cè),取其逆:

          理解線(xiàn)性變換和基變換變化之間的區(qū)別非常重要。
          接下來(lái)我們將看到這兩種轉(zhuǎn)換是如何關(guān)聯(lián)的。

          線(xiàn)性變換與基變換的關(guān)系

          如果你觀察,基矩陣的變化是線(xiàn)性變換矩陣的逆。這意味著,如果我們知道攝像機(jī)變換矩陣,即在世界上負(fù)責(zé)旋轉(zhuǎn)和移動(dòng)攝像機(jī)的矩陣,我們可以取其逆矩陣,這可以幫助我們找到攝像機(jī)上點(diǎn)的坐標(biāo)。

          平移

          通過(guò)平移改變坐標(biāo)

          平移的想法很簡(jiǎn)單——只要有一點(diǎn)??, 我們移動(dòng)它一個(gè)偏移量來(lái)得到點(diǎn)??′ 如下圖所示:

          在這里,我們移動(dòng)點(diǎn)?? 坐標(biāo)(??, ??) ,偏移量為(???, ??) ,得到點(diǎn)??′ (??′, ??′).。我們的目標(biāo)是找到(??′, ??′).
          從這個(gè)圖來(lái)看,
          x′ = x - a
          y′ = y + b
          我們不能將上述方程表示為矩陣乘法——至少不能用它們當(dāng)前的表示形式。
          訣竅是增加一個(gè)額外的維度,然后我們可以將平移表示為線(xiàn)性變換,如下所示:

          用額外維度表示的坐標(biāo)稱(chēng)為齊次坐標(biāo)。
          為了從齊次坐標(biāo)中得到歐幾里德坐標(biāo),我們只需除以最后一個(gè)元素,如下所示:
          [x, y, 1] ? [x/1, y/1] = [x, y]
          通常,我們?cè)邶R次空間中執(zhí)行所有操作,因?yàn)檫@很容易處理,最后,當(dāng)我們完成時(shí),我們轉(zhuǎn)換回歐幾里德空間。稍后我們將看到更多細(xì)節(jié)。

          通過(guò)平移改變基

          就像我們之前看到的,在基變換的變化中,我們變換軸而不是點(diǎn)。在下面的示例中,我們移動(dòng)???? 坐標(biāo)軸偏移以獲得??′??′. 我們的目標(biāo)是找到??′??′下的點(diǎn)??的坐標(biāo).

          舊軸XY下P的坐標(biāo)是(x,y),新軸??′??′ 下P的坐標(biāo)(??′,??′). 這里的偏移量是(??, ??).
          從圖上看,
          x′ = x - a
          y′ = y - b
          同樣,為了將上述方程表示為矩陣乘法,我們使用齊次坐標(biāo):

          即使在平移中,線(xiàn)性變換和基變換的變化也是相反的。

          攝像機(jī)外參矩陣

          我們分別研究了旋轉(zhuǎn)和平移;然而,我們可以使用如下所示的矩陣組合一次性執(zhí)行這兩個(gè)操作:

          在這里?? 是旋轉(zhuǎn)矩陣,形狀是(3,3)和?? 是偏移量矩陣,形狀是(3,1)。
          通過(guò)求最終變換矩陣的逆,可以得到基矩陣的變化。我們稱(chēng)這個(gè)矩陣是攝像機(jī)外參矩陣E,形狀是(4,4)
          使用??, 我們可以找到相機(jī)上任何一點(diǎn)的坐標(biāo)。

          自由度

          相機(jī)外參矩陣自由度是6。三個(gè)旋轉(zhuǎn)角度和沿X、Y、Z軸的三個(gè)偏移。

          簡(jiǎn)化矩陣

          我們可以看到相機(jī)外參矩陣的最后一行是0和1。它不會(huì)給轉(zhuǎn)換增加任何價(jià)值,它的唯一目的是增加一個(gè)額外的維度——這意味著,正如我們將在下面的示例中看到的,我們可以刪除最后一行。

          實(shí)例

          我們舉一個(gè)實(shí)際操作的例子!

          設(shè)置

          包含所有代碼的GitHub存儲(chǔ)庫(kù)可以在這里找到。
          https://github.com/wingedrasengan927/Image-formation-and-camera-calibration
          可以通過(guò)運(yùn)行以下命令來(lái)設(shè)置環(huán)境:
          # create a virtual environment in anaconda
          conda create -n camera-calibration-python python=3.6 anaconda
          conda activate camera-calibration-python

          # clone the repository and install dependencies
          git clone https://github.com/wingedrasengan927/Image-formation-and-camera-calibration.git
          cd Image-formation-and-camera-calibration
          pip install -r requirements.txt
          注意:這假設(shè)你已經(jīng)安裝了anaconda。
          我們將使用兩個(gè)主要的庫(kù):
          • pytransform3d:這個(gè)庫(kù)進(jìn)行三維空間中的可視化和轉(zhuǎn)換。
          • ipympl:它使matplotlib繪圖具有交互性。

          實(shí)例直覺(jué)

          在本例中,我們將首先創(chuàng)建旋轉(zhuǎn)和平移的變換矩陣,將它們組合成一個(gè)矩陣,并使用它來(lái)變換相機(jī)。
          然后,我們將通過(guò)對(duì)變換矩陣求逆來(lái)創(chuàng)建基矩陣的變化,并將其應(yīng)用于一個(gè)點(diǎn),并將其坐標(biāo)從世界幀更改為相機(jī)幀。
          下面是示例的筆記本,也可以在存儲(chǔ)庫(kù)中找到。
          https://github.com/wingedrasengan927/Image-formation-and-camera-calibration
          %matplotlib widget

          import matplotlib.pyplot as plt
          from utils import *
          創(chuàng)建轉(zhuǎn)換矩陣
          # rotate an angle of pi/4 along the standard Y axis
          angles = [np.pi/4]
          order = 'y'

          # transalte by the given offset
          offset = np.array([0, -8, 0])

          # define parameters for the image plane
          f = 2
          img_size = (7, 7)
          # create rotation transformation matrix
          R = create_rotation_transformation_matrix(angles, order)
          R_ = np.identity(4)
          R_[:3, :3] = R

          # create translation transformation matrix
          T_ = create_translation_matrix(offset)
          R_, T_
          (array([[ 0.70710678, 0. , -0.70710678, 0. ],
          [ 0. , 1. , 0. , 0. ],
          [ 0.70710678, 0. , 0.70710678, 0. ],
          [ 0. , 0. , 0. , 1. ]]),
          array([[ 1., 0., 0., 0.],
          [ 0., 1., 0., -8.],
          [ 0., 0., 1., 0.],
          [ 0., 0., 0., 1.]]))
          轉(zhuǎn)換并繪制
          # create an image grid
          xx, yy, Z = create_image_grid(f, img_size)

          # convert the image grid to homogeneous coordinates
          pt_h = convert_grid_to_homogeneous(xx, yy, Z, img_size)

          # transform the homogeneous coordinates
          pt_h_transformed = R_ @ T_ @ pt_h

          # convert the transformed homogeneous coordinates back to the image grid
          xxt, yyt, Zt = convert_homogeneous_to_grid(pt_h_transformed, img_size)
          # define axis and figure
          fig = plt.figure(figsize=(6, 4))
          ax = fig.add_subplot(111,projection='3d')

          # set limits
          ax.set(xlim=(-10, 5), ylim=(-15, 5), zlim=(0, 10))

          # plot the global basis and the transformed camera basis
          ax = pr.plot_basis(ax)
          ax = pr.plot_basis(ax, R, offset)

          # plot the original and transformed image plane
          ax.plot_surface(xx, yy, Z, alpha=0.75)
          ax.plot_surface(xxt, yyt, Zt, alpha=0.75)

          ax.set_title("camera transformation")
          ax.set_xlabel("X-axis")
          ax.set_ylabel("Y-axis")
          ax.set_zlabel("Z-axis")
          Text(0.5, 0, 'Z-axis')



          創(chuàng)建基的變換矩陣
          E = np.linalg.inv(R_ @ T_)
          # remove last row of E
          E = E[:-1, :]
          進(jìn)行坐標(biāo)變換
          cw = np.array([-1/np.sqrt(2), -8, 1/np.sqrt(2), 1]) # homogeneous coordinates of the point wrt the world
          cc = E @ cw.reshape(4, 1) # coordinates of the point wrt the camera
          cc = cc.flatten()
          cc
          array([0., 0., 1.])
          讓我們一步一步地分解:
          • 首先,我們導(dǎo)入必要的庫(kù)。utils.py文件包含所有必要的幫助函數(shù)。%matplotlib widget啟用了ipympl后端,使我們能夠使用繪圖。
          • 接下來(lái),我們定義必要的參數(shù),如角度、旋轉(zhuǎn)順序、平移偏移、焦距和圖像平面的大小。焦距和圖像平面僅用于演示目的,我們將在下一篇文章中詳細(xì)討論它們。
          • 在這里,我們保持簡(jiǎn)單,關(guān)于標(biāo)準(zhǔn)Y軸旋轉(zhuǎn)??/4。然而,我們可以圍繞任何軸進(jìn)行任意數(shù)量的旋轉(zhuǎn)。注意旋轉(zhuǎn)的順序。我們的平移偏移量是[0,-8,0],沿Y軸8個(gè)單位。
          • 使用這些參數(shù),我們?yōu)樾D(zhuǎn)和平移創(chuàng)建變換矩陣。
          • 接下來(lái),我們使用變換矩陣轉(zhuǎn)換最初位于原點(diǎn)的相機(jī)并繪制它。多虧了ipympl,圖表是互動(dòng)的。試著擺弄一下圖表,用不同的視角來(lái)觀看。


          • 接下來(lái),我們通過(guò)對(duì)變換矩陣求逆來(lái)創(chuàng)建基矩陣的變化,即相機(jī)外參矩陣。
          • 最后,我們?nèi)∫粋€(gè)世界坐標(biāo)[-1/√2, -8, 1/√2],然后應(yīng)用基變換的變化,得到相機(jī)的坐標(biāo)為[0, 0, 1]。這是有意義的,因?yàn)樵擖c(diǎn)位于相機(jī)Z軸的正上方。
          感謝閱讀!
          參考引用
          計(jì)算機(jī)視覺(jué)導(dǎo)論——Udacity:https://classroom.udacity.com/courses/ud810

          好消息!

          小白學(xué)視覺(jué)知識(shí)星球

          開(kāi)始面向外開(kāi)放啦??????




          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車(chē)道線(xiàn)檢測(cè)、車(chē)輛計(jì)數(shù)、添加眼線(xiàn)、車(chē)牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱(chēng)+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~



          瀏覽 58
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产美女日逼视频 | 狠狠色网站| 一级黄色AA片 | 久久成人麻豆影视 | 91成人久久久久久久 |