GPU バージョンの solvePnPRansac を使用してカメラの姿勢を推定しようとしていますが、次のエラーが発生します。
OpenCV エラー: cv::gpu::solvePnPRansac、ファイル C:\opencv\sources\modules\gpu\src でアサーションが失敗しました (object.rows == 1 && object.cols > 0 && object.type() == CV_32FC3) \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);
...
}
何か提案はありますか?