Python計算機視覺實驗五-針孔照相機模型_第1頁
Python計算機視覺實驗五-針孔照相機模型_第2頁
Python計算機視覺實驗五-針孔照相機模型_第3頁
Python計算機視覺實驗五-針孔照相機模型_第4頁
Python計算機視覺實驗五-針孔照相機模型_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Python計算機視覺實驗五——針孔照相機模型Python計算機視覺實驗五——針孔照相機模型1針孔相機模型針孔照相機模型(有時稱為射影照相機模型)是計算機視覺中?泛使?的照相機模型。對于?多數(shù)應?來說,針孔照相機模型簡單,并且具有?夠的精準度。這個名字來源于?種類似暗箱機的照相機。該照相機從?個?孔采集射到暗箱內部的光線。在光線投影到圖像平?之前,從唯??個點經(jīng)過,也就是照相機中?C。由圖像坐標軸和三維坐標系中的x軸和y軸對齊平?的假設,我們可以得出針孔照相機的投影性質。照相機的光學坐標軸和z軸?致,該投影?何?顆簡化成相似三?形。在投影之前通過旋轉和平移變換,對該坐標系加?三維點,會出現(xiàn)完整的投影變換。在針孔照相機中,三維點X投影為圖像點x(兩個點都是?齊次坐標表?的),如下所?:這?,3×4的矩陣P為照相機矩陣(或投影矩陣)。注意,在齊次坐標系中,三維點X的坐標由4個元素組成,X=[X,Y,Z,W]。這?的標量λ是三維點的逆深度。如果我們打算在齊次坐標中將最后?個數(shù)值歸?化為1,那么就會使?到它。1.1照相機矩陣照相機矩陣可以分解為:其中,R是描述照相機?向的旋轉矩陣,t是描述照相機中?位置的三維平移向量,內標定矩陣K描述照相機的投影性質。標定矩陣僅和照相機??的情況相關,通常情況下可以寫成:圖像平?和照相機中?間的距離為焦距f。當像素數(shù)組在傳感器上偏斜的時候,需要?到傾斜參數(shù)s。在?多數(shù)情況下,s可以設置成0.也就是說:這?,我們使?了另外的記號fx和fy,兩者關系為fx=αfy??v橫?例參數(shù)α是在像素元素?正?形的情況下使?的。通常情況下,我們還可以默認設置α=1.經(jīng)過這些假設,標定矩陣變?yōu)椋撼咕嘀?,標定矩陣中剩余的?參數(shù)為光?(有時稱為主點)的坐標c=[cx,cy],也就是光線坐標軸和圖像平?的交點。因為光?通常在圖像的中?,并且圖像的坐標是從左上?開始計算的,所以光?的坐標常接近于圖像寬度和?度的?半。特別強調?點,這這個例?中,唯?未知的變量是焦距f。1.2三維點的投影以下是創(chuàng)建照相機類,?來處理我們對照相機和投影建模所需要的基本操作:fromscipyimportlinalgfrompylabimport*classCamera(object):"""表?針孔照相機的類"""def__init__(self,P):"""初始化P=K[R|t]照相機模型"""self.P=Pself.K=None#標定矩陣self.R=None#旋轉self.t=None#平移self.c=None#照相機中?defproject(self,X):"""X(4×n的數(shù)組)的投影點,并進?坐標歸?化"""x=dot(self.P,X)foriinrange(3):x[i]/=x[2]returnxdefrotation_matrix(a):"""創(chuàng)建?個?于圍繞向量a軸旋轉的三維旋轉矩陣"""R=eye(4)R[:3,:3]=linalg.expm([0,-a[2],a[1]],[a[2],0,-a[0]],[-a[1],a[0],0])returnR1.3照相機矩陣的分解如果給定?程(1.1節(jié)中)所?的照相機矩陣P,我們需要恢復內參數(shù)K以及照相機的位置t和姿勢R。矩陣分塊操作稱為因?分解。這?,我們將使??種矩陣因?分解的?法,稱為RQ因?分解。'''RQ因?分解?法'''deffactor(self):"""將照相機矩陣分解為K,R,t,其中,R=K[R|t]"""#分解前3×3的部分K,R=linalg.rq(self.P[:,:3])#將K的對?線元素設為正值T=diag(sign(diag(K)))iflinalg.det(T)<0:T[1,1]*=-1self.K=dot(K,T)self.R=dot(T,R)#T的逆矩陣為其??self.t=dot(linalg.inv(self.K),self.P[:,3])returnself.K,self.R,self.t1.4照相機中?給定照相機投影矩陣P,我們可以計算出空間上照相機的所在位置。照相機的中?C,是?個三維點,滿?約束PC=0。對于投影矩陣為P=K[R|t]的照相機,有:照相機的中?可以由下述式?來計算:注意,如預期?樣,照相機的中?和內標定矩陣K?關。下?的代碼可以按照上?公式計算照相機的中?。將其添加到Camera類中,該?法會返回照相機的中?:'''照相機中?'''defcenter(self):"""計算并返回照相機的中?"""ifself.cisnotNone:returnself.celse:#通過因?分解計算cself.factor()self.c=-dot(self.R.T,self.t)returnself.c2相機標定在圖像測量過程以及機器視覺應?中,為確定空間物體表?某點的三維?何位置與其在圖像中對應點之間的相互關系,必須建?相機成像的?何模型,這些?何模型參數(shù)就是相機參數(shù)。【1】進?攝像機標定的?的:求出相機的內、外畸變【2】標定相機后通常是想做兩件事:?個是由于每個鏡頭的畸變程度各不相同,通過相機標定可以校正這種鏡頭畸變矯正畸變,?成矯正后的圖像;另?個是根據(jù)獲得的圖像重構三維場景??偨Y?下公式?致如下:相機標定的輸?:標定圖像上所有內?點的圖像坐標,標定板圖像上所有內?點的空間三維坐標(?般情況下假定圖像位于Z=0平?上)。相機標定的輸出:攝像機的內參、外參系數(shù)。這三個基礎的問題就決定了使?Opencv實現(xiàn)張正友法標定相機的標定流程、標定結果評價以及使?標定結果矯正原始圖像的完整流程:1.準備標定圖?2.對每?張標定圖?,提取?點信息3.對每?張標定圖?,進?步提取亞像素?點信息4.在棋盤標定圖上繪制找到的內?點(?必須,僅為了顯?)5.相機標定我準備的是5張下圖這種格?數(shù)為15×10,內?點為14×9的棋盤格圖?,求解的是拍攝?機的內部參數(shù)和外部參數(shù)、畸變系數(shù)。2.1代碼importcv2importnumpyasnpimportglob#找棋盤格?點#閾值criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001)#棋盤格模板規(guī)格w=14#內?點個數(shù),內?點是和其他格?連著的點h=9#世界坐標系中的棋盤格點,例如(0,0,0),(1,0,0),(2,0,0)....,(8,5,0),去掉Z坐標,記為?維矩陣objp=np.zeros((w*h,3),np.float32)objp[:,:2]=np.mgrid[0:w,0:h].T.reshape(-1,2)#儲存棋盤格?點的世界坐標和圖像坐標對objpoints=[]#在世界坐標系中的三維點imgpoints=[]#在圖像平?的?維點images=glob.glob('picture1/*.jpg')forfnameinimages:img=cv2.imread(fname)gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#找到棋盤格?點#棋盤圖像(8位灰度或彩?圖像)棋盤尺?存放?點的位置ret,corners=cv2.findChessboardCorners(gray,(w,h),None)#如果找到?夠點對,將其存儲起來ifret==True:#?點精確檢測#輸?圖像?點初始坐標搜索窗?為2*winsize+1死區(qū)求?點的迭代終?條件cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)objpoints.append(objp)imgpoints.append(corners)#將?點在圖像上顯?cv2.drawChessboardCorners(img,(w,h),corners,ret)dWindow('findCorners',cv2.WINDOW_NORMAL)cv2.resizeWindow('findCorners',640,480)#調整窗???cv2.imshow('findCorners',img)cv2.waitKey(1000)cv2.destroyAllWindows()#標定、去畸變#輸?:世界坐標系?的位置像素坐標圖像的像素尺???3*3矩陣,相機內參數(shù)矩陣畸變矩陣#輸出:標定結果相機的內參數(shù)矩陣畸變系數(shù)旋轉矩陣平移向量ret,mtx,dist,rvecs,tvecs=cv2.calibrateCamera(objpoints,imgpoints,gray.shape[::-1],None,None)#mtx:內參數(shù)矩陣#dist:畸變系數(shù)#rvecs:旋轉向量(外參數(shù))#tvecs:平移向量(外參數(shù))print(("ret:"),ret)print(("內參數(shù)矩陣:\n"),mtx)print(("畸變系數(shù):\n"),dist)print(("旋轉向量:\n"),rvecs)print(("平移向量:\n"),tvecs)#去畸變#內參數(shù)矩陣#畸變系數(shù)distortioncofficients=(k_1,k_2,p_1,p_2,k_3)#旋轉向量#外參數(shù)#平移向量#外參數(shù)img2=cv2.imread('picture1/5.jpg')h,w=img2.shape[:2]#我們已經(jīng)得到了相機內參和畸變系數(shù),在將圖像去畸變之前,#我們還可以使?cv.getOptimalNewCameraMatrix()優(yōu)化內參數(shù)和畸變系數(shù),#通過設定?由?由?例因?alpha。當alpha設為0的時候,#將會返回個剪裁過的將去畸變后不想要的像素去掉的內參數(shù)和畸變系數(shù);設為1的時候,將會返回個包含額外??像素點的內參數(shù)和畸變系數(shù),并#alpha當ROI?于將其剪裁掉個newcameramtx,roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h))#?由?例參數(shù)dst=cv2.undistort(img2,mtx,dist,None,newcameramtx)#根據(jù)前?ROI區(qū)域裁剪圖?x,y,w,h=roidst=dst[y:y+h,x:x+w]cv2.imwrite('calibresult.jpg',dst)#反投影誤差#通過反投影誤差,我們可以來評估結果的好壞。越接0近,說明結果越理想。#通過之前計算的內參數(shù)矩陣、畸變系數(shù)、旋轉矩陣和平移向量,使?jectPoints()計算三維點到?維圖像的投影,#然后計算反投影得到的點與圖像上檢測到的點的誤差,最后計算?個對于所有標定圖像的平均誤差,這個值就是反投影誤差。total_erro

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論