Я пытаюсь использовать gpu-версию solvePnPRansac для оценки положения камеры, но получаю следующую ошибку:
Ошибка OpenCV: утверждение не выполнено (object.rows == 1 && object.cols> 0 && object.type () == CV_32FC3) в cv :: gpu :: solvePnPRansac, файл C: \ opencv \ sources \ modules \ gpu \ src \ calib3d.cpp, строка 218
Если я запускаю свой код с использованием convertPnP или решения на основе CPU, то все работает нормально.
Я взглянул на код calib3d.cpp в строке 218, и проблема, похоже, связана с первым параметром функции (это должен быть список контрольных точек).
Кажется, что формат, который я использую для отправки контрольной точки в функцию, неправильный, но я не выяснил, какой из них правильный.
Вот мой код:
// Reference Points and Detected Points for Pose Estimation
std::vector<cv::Point3f> refMarkerPoint;
std::vector<cv::Point2f> markerPoints;
...
cv::Mat rvec = cv::Mat::zeros(1, 3, CV_32F);
cv::Mat tvec = cv::Mat::zeros(1, 3, CV_32F);
cv::Mat rotation = cv::Mat::zeros(1, 3, CV_32F);
cv::Mat tvec2 = cv::Mat::zeros(1, 3, CV_32F);
Vec3d eulerAngles;
...
if (cx_right != 0 && cx_left != 0 && markerPoints.size() > 0)
{
marker_detected = 1;
//solvePnPRansac(refMarkerPoint, markerPoints, cameraMatrix, distCoeffs, rvec, tvec, false, 20, 4, 20, noArray(), CV_ITERATIVE); // CV_EPNP, CV_P3P
//solvePnP(Mat(refMarkerPoint), Mat(markerPoints), cameraMatrix, distCoeffs, rvec, tvec);
gpu::solvePnPRansac(Mat(refMarkerPoint), Mat(markerPoints), cameraMatrix, distCoeffs, rvec, tvec);
cv::Rodrigues(rvec, rotation);...
}
У вас есть какие-нибудь предложения?
первый параметр должен быть однобитным матом CV_32FC3, в то время как в вашем коде первый параметр может быть одностолбцовым матом. попробуйте изменить его
Других решений пока нет …