opencv+pythons相机标定源码解析
生活随笔
收集整理的這篇文章主要介紹了
opencv+pythons相机标定源码解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
相機標定原理,這里不再贅述,一般使用張友正相機標定法。這里只介紹了標定相機內參的方法,即3x3的matrix。
import cv2 import numpy as np import glob# 設置尋找亞像素角點的參數,采用的停止準則是最大循環次數30和最大誤差容限0.001 criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)# 獲取標定板角點的位置 objp = np.zeros((5 * 7, 3), np.float32) ## 僅算內角點,注意內角點即不靠近邊界的角點 objp[:, :2] = np.mgrid[0:7, 0:5].T.reshape(-1, 2) # 將世界坐標系建在標定板上,所有點的Z坐標全部為0,所以只需要賦值x和y 5行7列reshape成(35,2),即真實的坐標(0,0),(1,0)... a = np.mgrid[0:7, 0:5].T b = np.mgrid[0:7, 0:5] print(a, a.shape) #(5,7,2) print(b, b.shape) #(2,7,5) #exit() obj_points = [] # 存儲3D點 img_points = [] # 存儲2D點images = glob.glob("./picture/*.jpg") for fname in images:img = cv2.imread(fname)print(fname)#h, w, _ = img.shapeimg = cv2.resize(img, (600, 600))#print(img)cv2.waitKey(15)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#cv2.imshow('img', gray)size = gray.shape[::-1]ret, corners = cv2.findChessboardCorners(gray, (7, 5), None) # 尋找真實世界角點坐標在照片中的像素坐標,(這里的7和5,表示Number of inner corners per a chessboard row and column,一定注意,不是7行5列,有些博客的介紹是錯誤的)print(corners.shape)print(ret)exit()if ret:obj_points.append(objp)corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria) # 在原角點的基礎上尋找亞像素角點,即精確到小數#print(corners2)if [corners2]:img_points.append(corners2)else:img_points.append(corners)cv2.drawChessboardCorners(img, (7, 5), corners, ret) #繪制角點cv2.imshow('img', img)cv2.waitKey(2000)print(len(img_points)) cv2.destroyAllWindows()# 標定 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)print("ret:", ret) print("mtx:\n", mtx) # 內參數矩陣 #print("dist:\n", dist) # 畸變系數 #print("rvecs:\n", rvecs) # 旋轉向量 #print("tvecs:\n", tvecs ) # 平移向量這里需要注意的是,真實坐標和照片內的像素坐標的順序一定要對應,并且這里的7和5分別代表列數和行數,需要根據自己的標定板來做相應的變換。
還有cv2.findChessboardCorners(gray, (7, 5), None)函數里7和5的意義,有寫博客的介紹成(行數,列數)是錯誤的。
這里的cornerSubPix函數是求亞像素坐標,即帶小數點的坐標值,目的是更加精確,詳細介紹可以參見這篇博客:https://www.cnblogs.com/riddick/p/8476456.html
本文參考:https://www.cnblogs.com/dinghongkai/p/11211840.html
關于調試中的一些bug:
cv2.error: OpenCV(4.1.1)error: (-215:Assertion failed) ni == ni1
這是因為在調用cv2.calibrateCamera時定義的棋盤格數量和真實的不一致,需要自行調整。
總結
以上是生活随笔為你收集整理的opencv+pythons相机标定源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matplotlib.pyplot分区绘
- 下一篇: Python装饰器学习笔记