opencv解决PnPRansac错误

标签 opencv python-3.x camera calibration

我正在关注 this关于 opencv 和相机标定的教程。 当我执行下面的代码时,我收到错误消息:

MacBook-Pro:src marvineffing$ python3 pose\ estimation.py 
OpenCV Error: Assertion failed (d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0)) in create, file /tmp/opencv320151207-39796-10do3cp/opencv-3.0.0/modules/core/src/matrix.cpp, line 2294
Traceback (most recent call last):
  File "pose estimation.py", line 31, in <module>
    rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)
cv2.error: /tmp/opencv320151207-39796-10do3cp/opencv-3.0.0/modules/core/src/matrix.cpp:2294: error: (-215) d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0) in function create

代码:

import cv2
import numpy as np
import glob


def draw(img, corners, imgpts):
    """draws line on xyz axis for a corner"""
    corner = tuple(corners[0].ravel())
    img = cv2.line(img, corner, tuple(imgpts[0].ravel(), (255, 0, 0)))
    img = cv2.line(img, corner, tuple(imgpts[1].ravel(), (0, 255, 0)))
    img = cv2.line(img, corner, tuple(imgpts[2].ravel(), (0, 0, 255)))
    return img

with np.load('matrix.npz') as X:
    mtx, dist, _, _ = [X[i] for i in ('mtx', 'dist', 'rvecs', 'tvecs')]

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*7, 3), np.float32)
objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2)

axis = np.float32([[3, 0, 0], [0, 3, 0], [0, 0, -3]]).reshape(-1, 3)

for fname in glob.glob('../sample_images/left*.jpg'):
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (7, 6),None)

    if ret == True:
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        # Find the rotation and translation vectors.
        rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)

        # project 3D points to image plane
        imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist)

        img = draw(img, corners2,imgpts)
        cv2.imshow('img', img)
        k = cv2.waitKey(0) & 0xff
        if k == 's':
            cv2.imwrite(fname[:6]+'.png', img)

cv2.destroyAllWindows()

我尝试了搜索互联网后提供的解决方案,但这对我没有帮助。欢迎任何帮助。我检查了每个参数,它们似乎是正确的,但我对 python 和 opencv 都很陌生。

最佳答案

改变
objp = np.zeros((6*7, 3), np.float32)
objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2)

objp = np.zeros((6*7, 1, 3), np.float32)
objp[:,:,:2] = np.mgrid[0:7, 0:6].T.reshape(-1,1,2)

改变
rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)

_,rvecs,tvecs,inliers = cv2.solvePnPRansac(objp,corners2,mtx,dist)

关于opencv解决PnPRansac错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34309865/

相关文章:

python - 如何获得唯一计数并动态生成文本

python - 用python从地址中分割城市和县

Python:对于工作目录中的每个目录,进入该目录并获取目录的名称

c++ - 访问 cv::Mat 中的所有像素

android - 预加载某些区域以避免由于加载图 block 而导致谷歌地图出现滞后

camera - 标定相机给定角度的圆周运动

c++ - 错误 : no instance of constructor "Camera::Camera" matches the argument list

c++ - OpenCV VideoWriter 不工作

c++ - MLP : Relation between number of iteration and accuracy

c# - 如何检测一个图像的矩形区域并将另一图像合并到该区域