2015-11-13 21 views
5

Używam Python 2.7 i opencv 3.0.0. Próbuję wykonać oszacowanie pozy na wideo na żywo. Użyłem więc pliku calibrate.py przez opencv. działa dobrze. W tym programie dodałem na końcach linie, aby traktować informacje w celu ułożenia osi. Użyłem tego: http://docs.opencv.org/master/d7/d53/tutorial_py_pose.html#gsc.tab=0Błąd przy użyciu funkcji solvePnPRansac

W wierszu z funkcją solvePnPRansac napisałem to zamiast: _, rvecs, tvecs, inliers = cv2.solvePnPRansac(obj_points[0], corners2, camera_matrix, dist_coefs) dodając _, na początku wiersza.

Mam ten błąd pojawiający się!

error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\core\src\matrix.cpp:2294: error: (-215) d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0) in function cv::_OutputArray::create 

Nie rozumiem tego w ogóle!

Czy ktoś może mi pomóc?

Oto mój kod traktować wideo:

cap = cv2.VideoCapture(0) 

while(1): 


    # Take each frame 
    ret, frame = cap.read() 
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) 

    # Find the chess board corners 
    ret, corners = cv2.findChessboardCorners(gray, (6,5),None) 

    if ret: 

     term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1) 

     corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),term) 


     _, rvecs, tvecs, inliers = cv2.solvePnPRansac(obj_points[0], corners2, camera_matrix, dist_coefs) 

     imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, camera_matrix, dist_coefs) 


     frame = draw(frame,corners2,imgpts) 

    cv2.imshow('img',frame) 

    k = cv2.waitKey(5) & 0xFF 
    if k == 27: 
     break 
cap.release() 
cv2.destroyAllWindows() 
+0

sam tu znaleźliście rozwiązanie? –

Odpowiedz

2

miałem ten sam problem. Użyłem solvePnP zamiast solvePnPRansac i działało dobrze. Myślę, że rozwiązujePnPRansac w Pythonie ma błąd.

0

solvePnpRansac ma tylko trzy wartości wyjściowych:

OutputArray  rvec, 
OutputArray  tvec, 
OutputArray  inliers = noArray(), 

więc wyjęcie _, na początku powinna ponownie pracę programu.

+0

To nie działa dla mnie. Otrzymuję: rvec, tvec, inliers = cv2.solvePnPRansac (objp, corners2, K, D) cv2.error: C: \ builds \ master_PackSlaveAddon-win64-vc12-static \ opencv \ modules \ core \ src \ matrix.cpp : 2355: błąd: (-215) d == 2 && (rozmiary [0] == 1 || rozmiary [1] == 1 || rozmiary [0] * rozmiary [1] == 0) w funkcji cv: : _OutputArray :: create –

0

Musisz zdefiniować obj_points w ten sam sposób w przykładzie. nie widzę obj_points definicji przewidzianej w Kodeksie urywek i myślę, że to kwestia

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

Istnieje różnica w definicji punktu modelu 3D między rozwiązaniami uPPP i rozwiązaniamiPnPRansac. Is not clear in the documentation, ale solvePnP potrzebuje modelu zdefiniowanego za pomocą macierzy o wymiarach 3xN/Nx3, a solvePnPRansac potrzebuje modelu z macierzą o wymiarach 3x1xN/Nx1x3.

Można użyć tego kodu, aby obejmować dodatkowy wymiar do swojego modelu

modelNx1x3 = np.zeros((N, 1, 3), np.float32) 
modelNx1x3[:, 0, :] = modelNx3[:, :] 

można również znaleźć dodatkowe informacje w the issue tracker in github