python+opencv相機標定

1、製做標定板html

  將下圖打印:app

  

                         圖一ide

   將打印出的紙固定放到一個平板上,使用同一相機從不一樣的位置,不一樣的角度,拍攝標定板的多張照片(10-20張最佳),將照片放到文件夾中:函數

    

 

 

2、提取標定板的世界座標spa

  須要注意標定板的大小是標定板在水平和豎直方向上內角點的個數。內角點指的是,標定板上不挨着邊界的角點(如圖一標定板大小爲6×9)。.net

3、張正友標定相機3d

  (一)張正友標定相機原理code

    1.求得相機內參數:htm

      用於標定的棋盤格是特製的,其角點座標已知。標定棋盤格是三維場景中的一個平面∏,棋盤格在成像平面爲π(知道了∏與π的對應點座標以後,可求解兩個平面1對應的單應矩陣H)。blog

      根據相機成像模型,P爲標定的棋盤座標,p爲其像素點座標。則,經過對應的點座標求解H後,可用於求K,R,T。

    2.設棋盤格所在平面爲世界座標系上XOY平面,則棋盤格上任一角點P世界座標系爲(X,Y,0)。

    

    三、內參約束條件

      

      

      

      

4、實驗結果

  (一)角點檢測

        

(二)相機參數:

   

其中:

ret: 48.043364303359844

內參數矩陣mtx:

[[2.89394836e+03 0.00000000e+00 1.18203203e+02]
[0.00000000e+00 7.97606845e+03 4.35321306e+02]
[0.00000000e+00 0.00000000e+00 1.00000000e+00]]

 

畸變係數dist:
[[-1.65763847e+02 8.93185546e+03 -2.72751174e+00 2.50930783e+00 9.38314320e+04]]

14張圖的旋轉向量rvecs分別是:
[array([[ 2.07541837],[-0.50479028],[-2.49085509]]),

array([[-1.16763908],[-1.12637317],[-1.07159956]]),

array([[ 1.19233488],[ 1.20624967],[-1.08566803]]),

array([[-1.16244554],[-1.13982256],[-1.06232949]]),

array([[-1.09733234],[-1.17285271],[-1.01093628]]),

array([[ 1.23539076],[ 1.16691521],[-1.11707143]]),

array([[-1.16607369],[-1.14036633],[-1.06258838]]),

array([[-1.23689999],[-1.08911596],[-1.1949959 ]]),

array([[-1.0598044 ],[-1.18432565],[-0.92552792]]),

array([[-1.28920578],[-1.03930212],[-1.2359854 ]]),

array([[ 1.21956501],[ 1.17686431],[-1.10965745]]),

array([[ 1.19665548],[ 1.20211216],[-1.08712586]]),

array([[-1.14009498],[-1.1404223 ],[-1.0457488 ]]),

array([[-1.72584463],[-0.30218636],[-2.16269854]])]

 

14張圖的平移向量tvecs分別是:
[array([[ 2.58103626],[ -1.449794 ],[153.26014997]]),

array([[-1.39291898],[-1.93347226],[58.34618242]]),

array([[-1.18779854],[-1.88277967],[62.72913595]]),

array([[-1.1216013 ],[-2.25848093],[62.93996114]]),

array([[ 0.10165107],[-2.50680014],[74.40682257]]),

array([[-1.28469761],[-2.49801729],[81.14504656]]),

array([[-1.10391052],[-2.04871883],[63.69652216]]),

array([[ 0.27557857],[-2.51892743],[88.71794513]]),

array([[-0.92126877],[-3.07010974],[82.83508132]]),

array([[ 0.28318588],[-2.15120651],[88.45919501]]),

array([[-1.03690781],[-2.36490656],[81.60288684]]),

array([[-1.13388547],[-2.10610231],[66.81208467]]),

array([[-0.46224606],[-2.18458233],[68.05082571]]),

array([[ 4.31072343],[ -5.89752854],[300.37214262]])]

(三)手機型號

  iPhone6s

  

5、代碼

 1 import cv2  2 import numpy as np  3 import glob  4 
 5 # 設置尋找亞像素角點的參數,採用的中止準則是最大循環次數30和最大偏差容限0.001
 6 criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)  7 
 8 # 獲取標定板角點的位置
 9 objp = np.zeros((6 * 9, 3), np.float32) 10 objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)  # 將世界座標系建在標定板上,全部點的Z座標所有爲0,因此只須要賦值x和y
11 
12 obj_points = []  # 存儲3D點
13 img_points = []  # 存儲2D點
14 
15 images = glob.glob("D:/there/pictures/*.jpg") 16 for fname in images: 17     img = cv2.imread(fname) 18     cv2.imshow('img',img) 19     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 20 
21     size = gray.shape[::-1] 22     ret, corners = cv2.findChessboardCorners(gray, (6, 9), None) 23     print(ret) 24 
25     if ret: 26 
27  obj_points.append(objp) 28 
29         corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria)  # 在原角點的基礎上尋找亞像素角點
30         #print(corners2)
31         if [corners2]: 32  img_points.append(corners2) 33         else: 34  img_points.append(corners) 35 
36         cv2.drawChessboardCorners(img, (8, 6), corners, ret)  # 記住,OpenCV的繪製函數通常無返回值
37         cv2.imshow('img', img) 38         cv2.waitKey(2000) 39 
40 print(len(img_points)) 41 cv2.destroyAllWindows() 42 
43 # 標定
44 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None) 45 
46 print("ret:", ret) 47 print("mtx:\n", mtx) # 內參數矩陣
48 print("dist:\n", dist)  # 畸變係數 distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
49 print("rvecs:\n", rvecs)  # 旋轉向量 # 外參數
50 print("tvecs:\n", tvecs ) # 平移向量 # 外參數
51 
52 print("-----------------------------------------------------")
View Code

 

6、參考文獻

相機標定求解相機內參數 https://www.cnblogs.com/gaoyixue/p/10406626.html

張正友相機標定Opencv實現以及標定流程&&標定結果評價&&圖像矯正流程解析(附標定程序和棋盤圖)https://blog.csdn.net/dcrmg/article/details/52939318

相關文章
相關標籤/搜索