我有密码
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.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:
chessboardActual.jpg:
棋盘抽签结果:
通过引入虚拟的第三维空间,我尝试将对象点转换为三维矢量而不是2--我找不到Point3f()的python版本。
我还从这里看到了https://github.com/opencv/opencv/issues/6002,有时这个错误可能会产生误导,而真正的问题是imagePoints中的一个向量是空的--我尝试过打印向量,但没有一个是空的。
希望有人能帮忙,可能只是拍更多的照片.
干杯,
发布于 2018-03-08 04:10:05
正如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.reshape有一种更好的方法。
对于对象点,我也需要相同的结构,即
objp = np.array([objp])
发布于 2019-09-26 04:22:24
OpenCV还要求浮点数具有单精度,如这问题所示。
这意味着在传递到np.float32
之前,每个数组都需要转换为calibrateCamera
。
发布于 2018-03-04 13:04:18
您可以使用以下方法创建虚拟objPoints
>>> 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)
您不需要实际为calibrateCamera提供“实际的”棋盘图像。
https://stackoverflow.com/questions/49100256
复制