双目测距项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
3.1KB

  1. import cv2
  2. import os
  3. import numpy as np
  4. leftpath = r'.\cap\left\cal'
  5. rightpath = r'.\cap\right\cal'
  6. CHECKERBOARD = (4, 4) # 棋盘格内角点数
  7. square_size = (30, 30) # 棋盘格大小,单位mm
  8. criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) # termination criteria 结束条件
  9. imgpoints_l = [] # 存放左图像坐标系下角点位置
  10. imgpoints_r = [] # 存放右图像坐标系下角点位置
  11. objpoints = [] # 存放世界坐标系下角点位置
  12. objp = np.zeros((1, CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32)
  13. objp[0, :, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
  14. objp[0, :, 0] *= square_size[0]
  15. objp[0, :, 1] *= square_size[1]
  16. for ii in range(len(os.listdir(leftpath))):
  17. img_l = cv2.imread(os.path.join(leftpath, os.listdir(leftpath)[ii]))
  18. gray_l = cv2.cvtColor(img_l, cv2.COLOR_BGR2GRAY)
  19. img_r = cv2.imread(os.path.join(rightpath, os.listdir(rightpath)[ii]))
  20. gray_r = cv2.cvtColor(img_r, cv2.COLOR_BGR2GRAY)
  21. ret_l, corners_l = cv2.findChessboardCorners(gray_l, CHECKERBOARD) # 检测棋盘格内角点。cv2.findChessboardCorners()函数是OpenCV中的一个函数,用于找到棋盘格的所有内角点,返回所有检测到的内角点的2D坐标。
  22. ret_r, corners_r = cv2.findChessboardCorners(gray_r, CHECKERBOARD)
  23. if ret_l and ret_r:
  24. print("计算第"+str(ii)+"对图像")
  25. objpoints.append(objp)
  26. corners2_l = cv2.cornerSubPix(gray_l, corners_l, (11, 11), (-1, -1), criteria)
  27. imgpoints_l.append(corners2_l)
  28. corners2_r = cv2.cornerSubPix(gray_r, corners_r, (11, 11), (-1, -1), criteria)
  29. imgpoints_r.append(corners2_r)
  30. img = cv2.drawChessboardCorners(img_l, CHECKERBOARD, corners2_l, ret_l)
  31. cv2.imwrite('./ChessboardCorners_img_l.jpg', img)
  32. ret, mtx_l, dist_l, rvecs_l, tvecs_l = cv2.calibrateCamera(objpoints, imgpoints_l, gray_l.shape[::-1], None, None) # 先分别做单目标定,利用单目校正函数实现相机内参初始化
  33. ret, mtx_r, dist_r, rvecs_r, tvecs_r = cv2.calibrateCamera(objpoints, imgpoints_r, gray_r.shape[::-1], None, None)
  34. retval, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T, E, F = cv2.stereoCalibrate(objpoints, imgpoints_l, imgpoints_r, mtx_l, dist_l, mtx_r, dist_r, gray_l.shape[::-1]) # 再做双目标定
  35. print("stereoCalibrate : \n")
  36. print("Camera matrix left : ") # Camera matrix 相机内参矩阵
  37. print(cameraMatrix1)
  38. print("distCoeffs left : ") # distCoeffs 畸变矩阵
  39. print(distCoeffs1)
  40. print("cameraMatrix right : ")
  41. print(cameraMatrix2)
  42. print("distCoeffs right : ")
  43. print(distCoeffs2)
  44. print("R : ") # 第一和第二个摄像机之间的旋转矩阵
  45. print(R)
  46. print("T : ") # 第一和第二个摄像机之间的平移矩阵
  47. print(T)
  48. print("E : ") # 本质矩阵
  49. print(E)
  50. print("F : ") # 基础矩阵
  51. print(F)
  52. np.save('Camera matrix left.npy', cameraMatrix1)
  53. np.save('distCoeffs left.npy', distCoeffs1)
  54. np.save('cameraMatrix right.npy', cameraMatrix2)
  55. np.save('distCoeffs right.npy', distCoeffs2)
  56. np.save('R.npy', R)
  57. np.save('T.npy', T)
  58. np.save('F.npy', F)
  59. np.save('E.npy', E)