import numpy as np import cv2,traceback chess_corner_x = 10 chess_corner_y = 8 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,30,0.001)
obj_p = np.mgrid[:chess_corner_x,:chess_corner_y].T.reshape(-1,2) z_p = np.zeros((chess_corner_x*chess_corner_y)) obj_p = np.c_[obj_p,z_p].astype(np.float32)
obj_points = [] img_points = []
def detect(): cap = cv2.VideoCapture(0) try: while 1: ret, frame = cap.read() if not ret: break gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray,(chess_corner_x,chess_corner_y),None) if ret: corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) obj_points.append(obj_p) img_points.append(corners2) frame = cv2.drawChessboardCorners(frame,(chess_corner_x,chess_corner_y),corners2,ret) cv2.imshow("cap", frame) if cv2.waitKey(30) == 27: break except: traceback.print_exc() finally: cap.release() cv2.destroyAllWindows() detect() ret,mrx,dist,rvecs,tveces = cv2.calibrateCamera(obj_points,img_points,(chess_corner_x,chess_corner_y),None,None) if ret: print("done!",mrx,dist,rvecs,tveces) else: print("calibration error") tot_mean_error=0 mean_error_image = 0 for i in range(len(obj_points)): reprojected_points,_ = cv2.projectPoints(obj_points[i],rvecs[i],tveces[i],mrx,dist) reprojected_points=reprojected_points.reshape(-1,2) mean_error_image=np.sum(np.sum(np.abs(img_points[i]-reprojected_points)**2,axis=-1)**(1./2))/np.alen(reprojected_points) tot_mean_error +=mean_error_image mean_error=tot_mean_error/len(obj_points) print("Mean reprojection error: ",mean_error) tot_error=0 total_points=0 for i in range(len(obj_points)): reprojected_points,_ = cv2.projectPoints(obj_points[i],rvecs[i],tveces[i],mrx,dist) reprojected_points=reprojected_points.reshape(-1,2) tot_error+=np.sum(np.abs(img_points[i]-reprojected_points)**2) total_points+=len(obj_points[i]) mean_error=np.sqrt(tot_error/total_points) print("Mean reprojection error: ",mean_error)
|