在尝试进行相机校准时尝试使用 cv2.solvePnP() 函数时出现以下错误。下面是我的代码。
我的python版本是3.10.9,我的OpenCV版本是4.7.0
import cv2
import numpy as np
import glob
from natsort import natsorted
import os
Xc, Yc, Zc = 0, 0, 0
camera_axis_len = 0.1
number_of_squares_X = 8 # Number of chessboard squares along the x-axis
number_of_squares_Y = 5 # Number of chessboard squares along the y-axis
nX = number_of_squares_X - 1 # Number of interior corners along x-axis
nY = number_of_squares_Y - 1 # Number of interior corners along y-axis
square_size = 0.032 # Length of the side of a square in meters
image_points_left = []
image_points_right = []
object_points_left = []
object_points_right = []
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
object_points_3D = np.zeros((nX * nY, 3), np.float32)
object_points_3D[:,:2] = np.mgrid[0:nY, 0:nX].T.reshape(-1, 2)
object_points_3D = object_points_3D * square_size
images = natsorted(glob.glob('calib_pictures_left/*.JPG'))
count = 0
corners_2 =[]
for image_file in images:
image = cv2.imread(image_file)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
success, corners = cv2.findChessboardCorners(gray, (nY, nX), cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)
if success == True:
object_points_left.append(object_points_3D)
corners_2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
image_points_left.append(corners_2)
print(corners_2)
cv2.drawChessboardCorners(image, (nY, nX), corners_2, success)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points_left, image_points_left, (1920,1080),None,None, flags=None)
object_points_left = np.array(object_points_left,dtype=np.float32)
image_points_left = np.array(image_points_left, dtype=np.float32)
print(image_points_left.dtype)
print(len(image_points_left))
print(len(object_points_left))
retval, rvec, tvec = cv2.solvePnP(object_points_left,image_points_left , mtx,dist,flags=None)
R, _ = cv2.Rodrigues(rvec)
我试图通过以下解决方案来修复错误,将图像点和对象点转换为 dtype float32 的 numpy 数组。尽管如此,这仍然会导致错误。我还确保在对象点和图像点之间有相同数量的点(26)。
我不确定如何纠正这个问题。