python cv2.calibrateCamera 抛出错误:objectPoints 应包含 Point3f 类型点的向量的向量

w1n*_*ter 6 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,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)`
Run Code Online (Sandbox Code Playgroud)

运行代码会抛出错误:

ret, matrix, dist, rvecs, tvecs = cv2.calibrateCamera(corners, chessCorners, chessboardImage.shape[::-1][1:3], None, None) cv2.error: C:\projects\opencv-python\opencv\modules\calib3d\src\calibration.cpp:3110: error: (-210) objectPoints should contain vector of vectors of points of type Point3f in function cv::collectCalibrationData

棋盘3.jpg:

棋盘3.jpg

棋盘实际.jpg:

棋盘实际.jpg

绘制棋盘结果:

绘制棋盘结果

我尝试通过引入虚拟第三维将对象点转换为 3 维向量而不是 2 维向量 - 我找不到 Point3f() 的 python 版本。

我还从这里看到https://github.com/opencv/opencv/issues/6002有时错误可能会产生误导,真正的问题是 imagePoints 内的向量之一是空的 - 我尝试打印向量没有一个是空的。

希望有人能帮忙,可能只是拍更多照片的情况......

干杯,

w1n*_*ter 5

正如 Zenith042 指出的那样,我的图像点和物体点的方向是错误的。然而,主要问题是我的图像点不是使用 numpy 数组,例如:

[[[ 137.5  205. ]]
[[ 143.5  206.5]]
 .
 .
 .
[[ 137.5  209.5]]]
Run Code Online (Sandbox Code Playgroud)

我反而需要:

[[ 137.5 205. ]
[ 143.5 206.5]
.
.
.
[ 137.5 209.5]]]
Run Code Online (Sandbox Code Playgroud)

我通过以下方式实现了这一目标:

ret, corners = cv2.findChessboardCorners(img, (9,6), None)
corners = np.array([[corner for [corner] in corners]])
Run Code Online (Sandbox Code Playgroud)

尽管我怀疑 numpy.reshape 有更好的方法。

我还需要相同的对象点结构,即

objp = np.array([objp])
Run Code Online (Sandbox Code Playgroud)