python cv2.CalibleCamera抛出错误:objectPoints应该包含Point3f类型点的向量向量
我有密码python cv2.CalibleCamera抛出错误:objectPoints应该包含Point3f类型点的向量向量,python,opencv,Python,Opencv,我有密码 img = cv2.imread("poolPictures\chessboard3.jpg", cv2.IMREAD_COLOR) chessboardImage = cv2.imread("poolPictures\chessboardActual.jpg", cv2.IMREAD_COLOR) ret, corners = cv2.findChessboardCorners(img, (9,6), None) cv2.drawChessboardCorners(img, (9,
img = cv2.imread("poolPictures\chessboard3.jpg", cv2.IMREAD_COLOR)
chessboardImage = cv2.imread("poolPictures\chessboardActual.jpg", cv2.IMREAD_COLOR)
ret, corners = cv2.findChessboardCorners(img, (9,6), None)
cv2.drawChessboardCorners(img, (9,6), corners, ret)
chessRet, chessCorners = cv2.findChessboardCorners(chessboardImage, (9,6), None)
ret, matrix, dist, rvecs, tvecs = cv2.calibrateCamera(corners, chessCorners, chessboardImage.shape[::-1][1:3], None, None)`
运行代码会引发以下错误:
ret,matrix,dist,rvecs,tvecs=cv2.calibleCamera(角点,棋盘,棋盘图像。形状[::-1][1:3],无,无)
cv2.error:C:\projects\opencv python\opencv\modules\calib3d\src\calibration.cpp:3110:error:(-210)objectPoints应包含函数cv::collectCalibrationData中Point3f类型点的向量
chessboard3.jpg:
chessboardActual.jpg:
绘制棋盘的结果:
通过引入虚拟三维,我尝试将objectpoints转换为三维向量,而不是2-我找不到Point3f()的python版本
我还从这里看到,有时错误可能会产生误导,而真正的问题是imagePoints中的一个向量是空的-我已经尝试打印向量,但没有一个是空的
希望有人能帮忙,也许只是拍更多照片的例子
干杯,您可以使用
>>> objp = np.zeros((6*9, 3), np.float32)
>>> objp[:,:2] = np.mgrid[0:9, 0:6].T.reshape(-1,2)
>>> objp
array([[ 0., 0., 0.],
[ 1., 0., 0.],
[ 2., 0., 0.],
[ 3., 0., 0.],
[ 4., 0., 0.],
[ 5., 0., 0.],
[ 6., 0., 0.],
[ 7., 0., 0.],
[ 8., 0., 0.],
[ 0., 1., 0.],
[ 1., 1., 0.],
[ 2., 1., 0.],
[ 3., 1., 0.],
[ 4., 1., 0.],
[ 5., 1., 0.],
[ 6., 1., 0.],
[ 7., 1., 0.],
[ 8., 1., 0.],
[ 0., 2., 0.],
[ 1., 2., 0.],
[ 2., 2., 0.],
[ 3., 2., 0.],
[ 4., 2., 0.],
[ 5., 2., 0.],
[ 6., 2., 0.],
[ 7., 2., 0.],
[ 8., 2., 0.],
[ 0., 3., 0.],
[ 1., 3., 0.],
[ 2., 3., 0.],
[ 3., 3., 0.],
[ 4., 3., 0.],
[ 5., 3., 0.],
[ 6., 3., 0.],
[ 7., 3., 0.],
[ 8., 3., 0.],
[ 0., 4., 0.],
[ 1., 4., 0.],
[ 2., 4., 0.],
[ 3., 4., 0.],
[ 4., 4., 0.],
[ 5., 4., 0.],
[ 6., 4., 0.],
[ 7., 4., 0.],
[ 8., 4., 0.],
[ 0., 5., 0.],
[ 1., 5., 0.],
[ 2., 5., 0.],
[ 3., 5., 0.],
[ 4., 5., 0.],
[ 5., 5., 0.],
[ 6., 5., 0.],
[ 7., 5., 0.],
[ 8., 5., 0.]], dtype=float32)
然后你可以打电话
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objp, corners, img.shape[::-1],None,None)
实际上,您不需要为CalibleCamera提供“实际”的棋盘图像。正如Zenith042所指出的,我的图像点和对象点绕错了方向。但是,主要的问题是,我的图像点不是numpy阵列,而是:
[[[ 137.5 205. ]]
[[ 143.5 206.5]]
.
.
.
[[ 137.5 209.5]]]
相反,我需要:
[[ 137.5 205. ]
[ 143.5 206.5]
.
.
.
[ 137.5 209.5]]]
我通过以下方式实现了这一目标:
ret, corners = cv2.findChessboardCorners(img, (9,6), None)
corners = np.array([[corner for [corner] in corners]])
虽然我怀疑有一个更好的方法来重塑numpy
我还需要对象点的相同结构,即
objp = np.array([objp])
根据问题,OpenCV还要求浮点具有单一精度
这意味着每个数组在传递到calibleCamera
公平点之前都需要转换为np.float32
!不幸的是,它仍然抛出相同的错误。如果我使用img.shape[::-1]而不是像您一样使用img.shape[::-1][1:3],则会出现错误:函数正好接受2个参数(给定3个)。我不知道这是否与此有关。谢谢。@w1nter啊,对了,错误是由于图像中的颜色造成的。你可以像最初那样只切出尺寸,或者你可以通过gray=cv2.cvtColor(img,cv2.COLOR\u bgr2 gray)
将图像转换为灰色,在灰度图像上进行角点查找,然后使用gray.shape[:-1]
啊好的,我现在用imread_灰度来读取图像,但是原始错误仍然存在。重塑方法是角=角。重塑(corners.shape[0],corners.shape[2])没错,np.float
相当于Cdouble
。因此必须指定np.float32
。