solvePnpRansac GPU断言失败
solvePnpRansac GPU assertion failed
我正在尝试使用 solvePnPRansac 的 gpu 版本来估计相机的姿态,但出现以下错误:
OpenCV 错误:断言失败 (object.rows == 1 && object.cols > 0 && object.type() == CV_32FC3) 在 cv::gpu::solvePnPRansac,文件 C:\opencv\sources\modules\gpu\src\calib3d.cpp,第 218 行
如果我 运行 我的代码使用基于 solvePnP 或 cpu 的 solvePnPRansac,一切正常。
我查看了第218行calib3d.cpp的代码,问题似乎与函数的第一个参数(应该是参考点列表)有关。
好像是我给函数发送参考点的格式不对,但一直没搞清楚哪个是正确的
这是我的代码:
// 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 Mat,而在您的代码中,第一个参数可能是一个单列的 Mat。尝试重塑它
我正在尝试使用 solvePnPRansac 的 gpu 版本来估计相机的姿态,但出现以下错误:
OpenCV 错误:断言失败 (object.rows == 1 && object.cols > 0 && object.type() == CV_32FC3) 在 cv::gpu::solvePnPRansac,文件 C:\opencv\sources\modules\gpu\src\calib3d.cpp,第 218 行
如果我 运行 我的代码使用基于 solvePnP 或 cpu 的 solvePnPRansac,一切正常。
我查看了第218行calib3d.cpp的代码,问题似乎与函数的第一个参数(应该是参考点列表)有关。
好像是我给函数发送参考点的格式不对,但一直没搞清楚哪个是正确的
这是我的代码:
// 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 Mat,而在您的代码中,第一个参数可能是一个单列的 Mat。尝试重塑它