Я пытаюсь передать cv::Matx31d
в качестве аргумента для objectPoints
.
cv::fisheye::projectPoints(objectPoints, imgpoints, rvec, tvec, K, D);
Но выдается следующее сообщение об ошибке:
OpenCV Error: Assertion failed (objectPoints.type() == (((5) & ((1 << 3) - 1)) + (((3)-1) << 3)) || objectPoints.type() == (((6) & ((1 << 3) - 1)) + (((3)-1) << 3))) in projectPoints, file /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/calib3d/src/fisheye.cpp, line 77
terminate called after throwing an instance of 'cv::Exception'
what(): /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/calib3d/src/fisheye.cpp:77: error: (-215) objectPoints.type() == (((5) & ((1 << 3) - 1)) + (((3)-1) << 3)) || objectPoints.type() == (((6) & ((1 << 3) - 1)) + (((3)-1) << 3)) in function projectPoints
Моя программа на C ++:
cv::Matx33d K(541.2152931632737, 0.0, 661.7479652584254,
0.0, 541.0606969363056, 317.4524205037745,
0.0, 0.0, 1.0);
cv::Vec4d D(-0.042166406281296365, -0.001223961942208027, -0.0017036710622692108, 0.00023929900459453295);
cv::Matx31d objectPoints(2, 2, 1); // x, y, z coordinates
cv::Matx31d rvec(0, 0, 0);
cv::Matx31d tvec(0, 0, 0);
cv::Matx21 imgpoints;
cv::fisheye::projectPoints(objectPoints, imgpoints, rvec, tvec, K, D);
Наоборот, если я передам objectPoints & imgpoints как вектор cv::Point
. Это работает.
std::vector<cv::Point2d> imgpoints;
std::vector<cv::Point3d> objectPoints;
objectPoints.push_back(cv::Point3d(2, 2, 1));
Не могу ли я передать cv::Matx31d objectPoints(2, 2, 1)
? Я предпочитаю Matx
, потому что я могу инициализировать его с pointerToData. например,
cv::Matx<double, 3, 100> objectPoints(pointer);