OpenCV错误通过标定教程(solvePnPRansac)
OpenCV Error through calibration tutorial (solvePnPRansac)
谁能知道这个 opencv 错误是怎么回事?
cv2.error: /home/desktop/OpenCV/opencv/modules/core/src/matrix.cpp:2294:
error: (-215) d == 2 && (sizes[0] == 1 || sizes[1] == 1 ||
sizes[0]*sizes[1] == 0) in function create
引发它的行代码是:
rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, cameraMatrix, dist)
我是按照这个教程一步步来的:
http://docs.opencv.org/master/dc/dbb/tutorial_py_calibration.html
似乎cameraMatrix
不正确,但为什么?
cameraMatrix
看起来像这样,而且看起来应该是这样(参见 here):
[[ 535.99484574, 0. , 334.33388272],
[ 0. , 535.99541504, 239.81116973],
[ 0. , 0. , 1. ]]
来自教程:
cameraMatrix – 输入相机矩阵
我觉得你的相机矩阵没问题。
错误可能是由objp或corners引起的。
objp 必须是对象坐标 space 中的对象点数组,3xN/Nx3 1 通道或 1xN/Nx1 3 通道,其中 N 是点数。 cv::Point3f的std::vector也可以传到这里
corners 必须是相应图像点的数组,2xN/Nx2 1 通道或 1xN/Nx1 2 通道,其中 N 是点数。 cv::Point2f的std::vector也可以传到这里
有同样的问题,如果您按照教程进行操作,objp
的声明不正确 - 应该是这样的(w,h
是您的棋盘尺寸):
objp = np.zeros((w*h, 1, 3), np.float32)
objp[:,:,:2] = np.mgrid[0:w, 0:h].T.reshape(-1,1,2)
还要注意改:
rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)
至:
_, rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)
或
rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)[:-3]
如果使用 Python。
在此处查看主题:
谁能知道这个 opencv 错误是怎么回事?
cv2.error: /home/desktop/OpenCV/opencv/modules/core/src/matrix.cpp:2294:
error: (-215) d == 2 && (sizes[0] == 1 || sizes[1] == 1 ||
sizes[0]*sizes[1] == 0) in function create
引发它的行代码是:
rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, cameraMatrix, dist)
我是按照这个教程一步步来的: http://docs.opencv.org/master/dc/dbb/tutorial_py_calibration.html
似乎cameraMatrix
不正确,但为什么?
cameraMatrix
看起来像这样,而且看起来应该是这样(参见 here):
[[ 535.99484574, 0. , 334.33388272],
[ 0. , 535.99541504, 239.81116973],
[ 0. , 0. , 1. ]]
来自教程: cameraMatrix – 输入相机矩阵
我觉得你的相机矩阵没问题。
错误可能是由objp或corners引起的。
objp 必须是对象坐标 space 中的对象点数组,3xN/Nx3 1 通道或 1xN/Nx1 3 通道,其中 N 是点数。 cv::Point3f的std::vector也可以传到这里
corners 必须是相应图像点的数组,2xN/Nx2 1 通道或 1xN/Nx1 2 通道,其中 N 是点数。 cv::Point2f的std::vector也可以传到这里
有同样的问题,如果您按照教程进行操作,objp
的声明不正确 - 应该是这样的(w,h
是您的棋盘尺寸):
objp = np.zeros((w*h, 1, 3), np.float32)
objp[:,:,:2] = np.mgrid[0:w, 0:h].T.reshape(-1,1,2)
还要注意改:
rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)
至:
_, rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)
或
rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)[:-3]
如果使用 Python。
在此处查看主题: