Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python cv2.CalibleCamera抛出错误:objectPoints应该包含Point3f类型点的向量向量_Python_Opencv - Fatal编程技术网

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
相当于C
double
。因此必须指定
np.float32