Python OpenCV cv2.solvePnP() 给出导致错误

问题描述 投票:0回答:0

在尝试进行相机校准时尝试使用 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)。

我不确定如何纠正这个问题。

python numpy opencv point camera-calibration
© www.soinside.com 2019 - 2024. All rights reserved.