歡迎來到深圳市四元數(shù)數(shù)控技術(shù)有限公司!
全國服務(wù)熱線
+86-15818624218
四元數(shù)數(shù)控 NEWS
全國服務(wù)熱線
15818624218
二維碼
深圳市四元數(shù)數(shù)控技術(shù)有限公司
手機(jī): 15818624218
郵箱:liusyscnc@qq.com
QQ:790708208
地址:深圳市光明區(qū)光明街道碧眼社區(qū)華強(qiáng)創(chuàng)意公園5棟A座19樓
當(dāng)前位置:首頁 > 行業(yè)新聞

視覺定位系統(tǒng)原理——基礎(chǔ)矩陣

產(chǎn)品詳情

  一、視覺定位系統(tǒng)基礎(chǔ)矩陣的原理

  介紹基礎(chǔ)矩陣我們先說一下對積幾和

  對極幾何一定是對二幅圖像而言,對極幾何實(shí)際上是“兩幅圖像之間的對極幾何”,它是圖像平面與以基線為軸的平面束的交的幾何(這里的基線是指連接攝像機(jī)中心的直線),以下圖為例:對極幾何描述的是左右兩幅圖像(點(diǎn)x和x’對應(yīng)的圖像)與以CC’為軸的平面束的交的幾何!

視覺對位原理矩形.png


  直線CC’為基線,以該基線為軸存在一個(gè)平面束,該平面束與兩幅圖像平面相交,下圖給出了該平面束的直觀形象,可以看到,該平面束中不同平面與兩幅圖像相交于不同直線;

視覺對位.png

  上圖中的灰色平面π,只是過基線的平面束中的一個(gè)平面(當(dāng)然,該平面才是平面束中最重要的、也是我們要研究的平面);

  epipolarpoints極點(diǎn)

  每一個(gè)相機(jī)的透鏡中心是不同的,會(huì)投射到另一個(gè)相機(jī)像面的不同點(diǎn)上。這兩個(gè)像點(diǎn)用eL和eR表示,被稱為epipolarpoints極點(diǎn)。兩個(gè)極點(diǎn)eL、eR分別與透鏡中心OL、OR在空間中位于一條直線上。

  epipolarplane極面

  將X、OL和OR三點(diǎn)形成的面稱為epipolarplane極面。

  epipolarline極線

  直線OL-X被左相機(jī)看做一個(gè)點(diǎn),因?yàn)樗屯哥R中心位于一條線上。然而,從右相機(jī)看直線OL-X,則是像面上的一條線直線eR-XR,被稱為epipolarline極線。從另一個(gè)角度看,極面X-OL-OR與相機(jī)像面相交形成極線。

  極線是3D空間中點(diǎn)X的位置函數(shù),隨X變化,兩幅圖像會(huì)生成一組極線。直線OL-X通過透鏡中心OL,右像面中對應(yīng)的極線必然通過極點(diǎn)eR。一幅圖像中的所有極線包含了該圖像的所有極點(diǎn)。實(shí)際上,任意一條包含極點(diǎn)的線都是由空間中某一點(diǎn)X推導(dǎo)出的一條極線。

  如果兩個(gè)相機(jī)位置已知,則:

  1.如果投影點(diǎn)XL已知,則極線eR-XR已知,點(diǎn)X必定投影到右像面極線上的XR處。這就意味著,在一個(gè)圖像中觀察到的每個(gè)點(diǎn),在已知的極線上觀察到該點(diǎn)的其他圖像。這就是Epipolarconstraint極線約束:X在右像面上的投影XR必然被約束在eR-XR極線上。對于OL-XL上的X,X1,X2,X3都受該約束。極線約束可以用于測試兩點(diǎn)是否對應(yīng)同一3D點(diǎn)。極線約束也可以用兩相機(jī)間的基本矩陣來描述。

  2.如果XL和XR已知,他們的投影線已知。如果兩幅圖像上的點(diǎn)對應(yīng)同一點(diǎn)X,則投影線必然交于X。這就意味著X可以用兩個(gè)像點(diǎn)的坐標(biāo)計(jì)算得到。

  二、視覺定位系統(tǒng)基礎(chǔ)矩陣

  如果已知基礎(chǔ)矩陣F,以及一個(gè)3D點(diǎn)在一個(gè)像面上的像素坐標(biāo)p,則可以求得在另一個(gè)像面上的像素坐標(biāo)p‘。這個(gè)是基礎(chǔ)矩陣的作用,可以表征兩個(gè)相機(jī)的相對位置及相機(jī)內(nèi)參數(shù)。

視覺對位原理.png

  面具體介紹基礎(chǔ)矩陣與像素坐標(biāo)p和p’的關(guān)系。

  以O(shè)1為原點(diǎn),光軸方向?yàn)閦軸,另外兩個(gè)方向?yàn)閤,y軸可以得到一個(gè)坐標(biāo)系,在這個(gè)坐標(biāo)系下,可以對P,p1(即圖中所標(biāo)p),p2(即圖中所標(biāo)p‘)得到三維坐標(biāo),同理,對O2也可以得到一個(gè)三維坐標(biāo),這兩個(gè)坐標(biāo)之間的轉(zhuǎn)換矩陣為[RT],即通過旋轉(zhuǎn)R和平移T可以將O1坐標(biāo)系下的點(diǎn)P1(x1,y1,z1),轉(zhuǎn)換成O2坐標(biāo)系下的P2(x2,y2,z2)。

  則可知,P2=R(P1-T)(1)

  采用簡單的立體幾何知識(shí),可以知道

  

在這里插入圖片描述


  其中,p,p‘分別為P點(diǎn)的像點(diǎn)在兩個(gè)坐標(biāo)系下分別得到的坐標(biāo)(非二維像素坐標(biāo))。Rp’為極面上一矢量,T為極面上一矢量,則兩矢量一叉乘為極面的法向量,這個(gè)法向量與極面上一矢量p一定是垂直的,所以上式一定成立。(這里采用轉(zhuǎn)置是因?yàn)閜會(huì)表示為列向量的形式,此處需要為行向量)

  采用一個(gè)常用的叉乘轉(zhuǎn)矩陣的方法,

  

微信截圖_20200730100716.png


  將我們的叉乘采用上面的轉(zhuǎn)換,會(huì)變成

  

在這里插入圖片描述


  紅框中所標(biāo)即為本征矩陣E,他描述了三維像點(diǎn)p和p‘之間的關(guān)系

  

在這里插入圖片描述


  有了本征矩陣,我們的基礎(chǔ)矩陣也就容易推導(dǎo)了,

  注意到將p和p‘換成P1和P2式(4)也是成立的,且有

  q1=K1P1(6)

  q2=K2P2(7)

  上式中,K1K2為相機(jī)的校準(zhǔn)矩陣,描述相機(jī)的內(nèi)參數(shù)q1q2為相機(jī)的像素坐標(biāo)代入式(4)中,得

  

在這里插入圖片描述


  上式中p->q1,p‘->q2

  這樣我們就得到了兩個(gè)相機(jī)上的像素坐標(biāo)和基礎(chǔ)矩陣F之間的關(guān)系了

  

在這里插入圖片描述


  二、不同圖像對的基礎(chǔ)矩陣

  代碼

  # coding: utf-8

  # In[1]:

  from PIL import Image

  from numpy import *

  from pylab import *

  import numpy as np

  # In[2]:

  from PCV.geometry import homography, camera, sfm

  from PCV.localdescriptors import sift

  # In[5]:

  # Read features

  im1 = array(Image.open('im1.jpg'))

  sift.process_image('im1.jpg', 'im1.sift')

  im2 = array(Image.open('im2.jpg'))

  sift.process_image('im2.jpg.', 'im2.sift')

  # In[6]:

  l1, d1 = sift.read_features_from_file('im1.sift')

  l2, d2 = sift.read_features_from_file('im2.sift')

  # In[7]:

  matches = sift.match_twosided(d1, d2)

  # In[8]:

  ndx = matches.nonzero()[0]

  x1 = homography.make_homog(l1[ndx, :2].T)

  ndx2 = [int(matches[i]) for i in ndx]

  x2 = homography.make_homog(l2[ndx2, :2].T)

  d1n = d1[ndx]

  d2n = d2[ndx2]

  x1n = x1.copy()

  x2n = x2.copy()

  # In[9]:

  figure(figsize=(16,16))

  sift.plot_matches(im1, im2, l1, l2, matches, True)

  show()

  # In[10]:

  #def F_from_ransac(x1, x2, model, maxiter=5000, match_threshold=1e-6):

  def F_from_ransac(x1, x2, model, maxiter=5000, match_threshold=1e-6):

  """ Robust estimation of a fundamental matrix F from point

  correspondences using RANSAC (ransac.py from

  http://www.scipy.org/Cookbook/RANSAC).

  input: x1, x2 (3*n arrays) points in hom. coordinates. """

  from PCV.tools import ransac

  data = np.vstack((x1, x2))

  d = 10 # 20 is the original

  # compute F and return with inlier index

  F, ransac_data = ransac.ransac(data.T, model,

  8, maxiter, match_threshold, d, return_all=True)

  return F, ransac_data['inliers']

  # In[11]:

  # find F through RANSAC

  model = sfm.RansacModel()

  F, inliers = F_from_ransac(x1n, x2n, model, maxiter=5000, match_threshold=1e-3)

  print(F)

  # In[12]:

  P1 = array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]])

  P2 = sfm.compute_P_from_fundamental(F)

  # In[13]:

  print(P2)

  print(F)

  # In[14]:

  # P2, F (1e-4, d=20)

  # [[ -1.48067422e+00 1.14802177e+01 5.62878044e+02 4.74418238e+03]

  # [ 1.24802182e+01 -9.67640761e+01 -4.74418113e+03 5.62856097e+02]

  # [ 2.16588305e-02 3.69220292e-03 -1.04831621e+02 1.00000000e+00]]

  # [[ -1.14890281e-07 4.55171451e-06 -2.63063628e-03]

  # [ -1.26569570e-06 6.28095242e-07 2.03963649e-02]

  # [ 1.25746499e-03 -2.19476910e-02 1.00000000e+00]]

  # In[15]:

  # triangulate inliers and remove points not in front of both cameras

  X = sfm.triangulate(x1n[:, inliers], x2n[:, inliers], P1, P2)

  # In[16]:

  # plot the projection of X

  cam1 = camera.Camera(P1)

  cam2 = camera.Camera(P2)

  x1p = cam1.project(X)

  x2p = cam2.project(X)

  # In[17]:

  figure(figsize=(16, 16))

  imj = sift.appendimages(im1, im2)

  imj = vstack((imj, imj))

  imshow(imj)

  cols1 = im1.shape[1]

  rows1 = im1.shape[0]

  for i in range(len(x1p[0])):

  if (0<= x1p[0][i]

  plot([x1p[0][i], x2p[0][i]+cols1],[x1p[1][i], x2p[1][i]],'c')

  axis('off')

  show()

  # In[18]:

  d1p = d1n[inliers]

  d2p = d2n[inliers]

  # In[19]:

  # Read features

  im3 = array(Image.open('im3.jpg'))

  sift.process_image('im3.jpg', 'im3.sift')

  l3, d3 = sift.read_features_from_file('im3.sift')

  # In[20]:

  matches13 = sift.match_twosided(d1p, d3)

  # In[21]:

  ndx_13 = matches13.nonzero()[0]

  x1_13 = homography.make_homog(x1p[:, ndx_13])

  ndx2_13 = [int(matches13[i]) for i in ndx_13]

  x3_13 = homography.make_homog(l3[ndx2_13, :2].T)

  # In[22]:

  figure(figsize=(16, 16))

  imj = sift.appendimages(im1, im3)

  imj = vstack((imj, imj))

  imshow(imj)

  cols1 = im1.shape[1]

  rows1 = im1.shape[0]

  for i in range(len(x1_13[0])):

  if (0<= x1_13[0][i]

  plot([x1_13[0][i], x3_13[0][i]+cols1],[x1_13[1][i], x3_13[1][i]],'c')

  axis('off')

  show()

  # In[23]:

  P3 = sfm.compute_P(x3_13, X[:, ndx_13])

  # In[24]:

  print(P3)

  # In[25]:

  print(P1)

  print(P2)

  print(P3)

  # In[26]:

  # Can't tell the camera position because there's no calibration matrix (K)

  得到視覺對位系統(tǒng)基礎(chǔ)矩陣如下

  

在這里插入圖片描述


  室外

  

在這里插入圖片描述


  得到基礎(chǔ)矩陣如下

  

在這里插入圖片描述



主站蜘蛛池模板: 扒丝袜永久网址pisiwa| 精品久久久久久无码人妻| 日韩在线视频网| 国产成人精品久久综合| 亚洲AV人无码综合在线观看| 超清首页国产亚洲丝袜| 欧美成人免费一级人片| 国产精品国产三级在线专区| 亚洲国产精品成人午夜在线观看 | 久久久精品久久久久久96| 黄色网站在线免费| 日韩高清在线播放| 国产在线中文字幕| 久久久最新精品| 色吊丝av中文字幕| 开心久久婷婷综合中文字幕| 免费很黄很色裸乳在线观看| eeuss鲁片一区二区三区| 漂亮华裔美眉跪着吃大洋全集| 在线视频国产网址你懂的在线视频| 亚洲精品无码mv在线观看网站 | 色欲综合久久中文字幕网| 新视觉yy6080私人影院| 午夜影院app| chinese乱子伦xxxx国语对白| 波多洁野衣一二区三区| 国产精品亚洲欧美一级久久精品 | 中文字幕在线视频免费观看| 精品福利一区二区三区免费视频 | 欧美日韩精品久久久久 | 伊人色院成人蜜桃视频| 97精品伊人久久大香线蕉| 欧美日韩国产成人高清视频 | 人人澡人人澡人人看添av| 91成人在线免费视频| 最新69堂国产成人精品视频| 国产丝袜无码一区二区三区视频| 下樱桃视频入口在线观看| 特区爱奴在线观看| 国产精品9999久久久久| 久久中文娱乐网|