现在自己在做一个gui,其中按下一个按键会读取已经记录下来的灰度图进行标定。其中,灰度图是判断存在 retL, corners = cv2.findChessboardCorners(img_l,(self.H,self.W),None)
当ret为true时记录下图片
def calculate(self):#计算内参
self.H = int(e1.get())
self.W = int(e2.get())
i = 0
pic_path = os.path.join("sample_pics")#存储图片的文件夹
for file in os.listdir(pic_path):
i=i+1
if i > 40:#图片多于40张可以开始标定
self.goodenough = True
if self.goodenough:
print("----*Calibrating*----")
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
#print(criteria)
objpoints= []
objp = np.zeros((8*6,3), np.float32)
objp[:,:2] = np.mgrid[0:8,0:6].T.reshape(-1,2)
imgpoints= []
for file in os.listdir(pic_path):#读取文件夹下所有图片
img_l = cv2.imread(os.path.join(pic_path,file), 0)
print(img_l.shape)
(retL, corners) = cv2.findChessboardCorners(img_l,(self.H,self.W),None)
if retL == True:
objpoints.append(objp)
corners = cv2.cornerSubPix(img_l,corners,(5,5),(-1,-1),criteria)
imgpoints.append(corners)
#print("1")
retL, mtxL, distL, rvecsL, tvecsL = cv2.calibrateCamera(objpoints,
imgpoints,
img_l.shape[::-1],None,None)
#print(2)
print("-------------------摄像头标定数据-----------------------")
print('ret:', retL)
print('mtx:\n', mtxL ) # 内参数矩阵
print('dist:\n', distL) # 畸变系数 distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print('rvecs:\n', rvecsL) # 旋转向量 # 外参数
print('tvecs:\n', tvecsL) # 平移向量 # 外参数
print("--------------------------------------------------------------")
else:
print("Please add more samples.")
想输出一个正确的标定内参结果
没有完整的代码没看太明白,给你个例子对比参考一下,我这个是先截取棋盘格(5*7的棋盘格)图像,按照规则命名后又读进来处理的:
#!/usr/bin/env python3
import cv2
import numpy as np
def findConner(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (nx, ny), None)
if ret==True:
cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
objpoints.append(objp)
imgpoints.append(corners)
cv2.drawChessboardCorners(image, (nx, ny), corners, True)
cv2.imshow("corners",image)
def getMatrix():
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, (640,480), None, None)
print("mtx:", mtx)
print("dist:", dist)
return mtx, dist
nx = 5
ny = 7
objp = np.zeros((nx*ny,3), np.float32)
objp[:,:2] = np.mgrid[0:nx,0:ny].T.reshape(-1,2)
objp = objp*31
objpoints = []
imgpoints = []
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 31, 0.001)
for i in range(1,8):
imageFile = 'images/13-'+str(i)+'.png'
img = cv2.imread(imageFile)
cv2.imshow(imageFile,img)
findConner(img)
cv2.waitKey(0)
cv2.destroyAllWindows()
mtx, dist = getMatrix()