Kinect + OpenCV: невозможно получить векторы вращения с помощью cv2.solvePnP в python

Я работаю над проектом, в котором мне нужно отслеживать воздушные объекты и вычислять шесть степеней свободы.

  1. В настоящее время я отслеживаю цветные шары и вычисляю их центр в rgb_frame и использую значения центра, чтобы найти глубину в depth_frame.

  2. После нахождения глубины (Z) в реальных координатах я вычисляю реальные X и Y, используя уравнения: X = (Zu)/fx и Y = (Zv) /fy , где fx,fy — фокусное расстояние, полученное из внутренних параметров kinect, а u и v в данном случае — значения x, y центра.

  3. Я рассматриваю (u, v) как точку изображения и (X, Y, Z) как точку изображения и использую этот метод:solvePnP

    obj_pts = np.array([[X,Y,Z]],np.float64) img_pts = np.array([[u,v]],np.float64)

    ret,rvecs,tvecs = cv2.solvePnP(obj_pts,img_pts,camera_matrix2,np_dist_coefs)

Я ожидаю найти rvecs, которые я буду использовать в качестве входных данных для:

cv2.Rodrigues(rvecs)

чтобы получить углы Эйлера, а именно, шаг, рыскание, крен.

В настоящее время у меня возникают проблемы с вызовомsolvePnP, который дает мне следующую ошибку:

/opencv-3.0.0/modules/calib3d/src/solvepnp.cpp:61: ошибка: (-215) npoints >= 0 && npoints == std::max(ipoints.checkVector(2, CV_32F), ipoints.checkVector(2, CV_64F)) в функцииsolvePnP

Я также понимаю, что отправлять только центр объекта и точки изображения не рекомендуется. Это мой первый шаг к реализации. Я намерен использовать детекторы функций, такие как SIFT, чтобы сделать его более интересным позже.

Может ли кто-нибудь предложить мой подход и помочь мне найти шесть степеней свободы:

forward/back, up/down, left/right, pitch, yaw, roll.


person touchStone    schedule 26.11.2015    source источник


Ответы (1)


Хотя мой подход был совершенно правильным, я упустил тот факт, что для вычисления ориентации 3D-объекта в реальных координатах нам нужно как минимум 4+ соответствующих набора точек в пиксельных и объектных координатах.

Мне просто нужно было проверить контуры на изображении с более чем 4 точками, и мой код работает так, как задумано, и я могу с точностью вычислить 6 степеней свободы, а также к настоящему времени я сделал его более сложным и вскоре Я смогу поделиться ссылкой git на свою работу.

Я все еще хотел бы услышать о том, как успешно проверить правильность ориентации, которую я могу вычислить, используя формулы Родригеса.

person touchStone    schedule 06.12.2015