2015-12-16 2 views
1

Я следую this учебник о opencv и калибровке камеры. Когда я выполнения ниже код, я получаю сообщение об ошибке:opencv Ошибка SolvePnPRansac

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.

ответ

1

изменение
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)

+0

あ り が と う ご ざ い ま す す す す す.................................. –

Смежные вопросы