2015-11-13 21 views
5

Ich verwende Python 2.7 und opencv 3.0.0. Ich versuche, eine Pose Schätzung auf einem Live-Video zu machen. Also habe ich die calibrate.py von opencv verwendet. es funktioniert gut. In diesem Programm habe ich am Ende Zeilen hinzugefügt, um die Informationen zu behandeln, um die Achse zu positionieren. Ich benutzte dieses: http://docs.opencv.org/master/d7/d53/tutorial_py_pose.html#gsc.tab=0Fehler bei der Verwendung der Funktion "solvePnPRansac"

Auf der Linie mit solvePnPRansac Funktion schrieb ich dieses stattdessen: _, rvecs, tvecs, inliers = cv2.solvePnPRansac(obj_points[0], corners2, camera_matrix, dist_coefs), das am Anfang der Linie hinzufügt.

Ich habe diesen Fehler angezeigt!

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 

Ich verstehe es überhaupt nicht!

Kann mir jemand helfen?

Hier ist mein Code, um das Video zu behandeln:

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

finden, haben Sie eine Lösung finden? –

Antwort

2

ich hatte das gleiche Problem. Ich habe SolvePnP anstelle von SolvePnPRansac verwendet und es hat gut funktioniert. Ich denke, solvePnPRansac in Python hat einen Fehler.

0

solvePnpRansac nur drei Ausgangswerte hat:

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

so die _, am Anfang Entfernen sollte das Programm erneut Arbeit machen.

+0

Das hat nicht für mich funktioniert. Ich bekomme: rvec, tvec, inliers = cv2.solvePnPRansac (objp, Ecken2, K, D) cv2.error: C: \ Builds \ master_PackSlaveAddon-win64-vc12-statische \ opencv \ modules \ core \ src \ matrix.cpp : 2355: Fehler: (-215) d == 2 && (Größen [0] == 1 || Größen [1] == 1 || Größen [0] * Größen [1] == 0) in Funktion cv: : _OutputArray :: create –

0

Sie müssen obj_points auf die gleiche Weise im Beispiel definieren. Ich sehe nicht obj_points Definition im Code-Schnipsel zur Verfügung gestellt, und ich denke, dass das Problem ist

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

Es gibt einen Unterschied in der 3D-Modellpunktdefinition zwischen solvePnP und solvePnPRansac. Is not clear in the documentation, aber solvePnP benötigt das Modell, das mit einer Matrix mit den Dimensionen 3xN/Nx3 definiert wurde und solvePnPRansac benötigt das Modell mit einer Matrix mit den Dimensionen 3x1xN/Nx1x3.

können Sie diesen Code verwenden, um die zusätzliche Dimension zu Ihrem Modell enthalten:

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

Sie auch hier gleiche weitere Details in the issue tracker in github

Verwandte Themen