cv :: InputArray не принимает cv :: Matx31d. Почему? - PullRequest
1 голос
/ 25 января 2020

Я пытаюсь передать 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);
...