#include "PnP.h" class PnPInfo { }; //Point2f reproject(Vector3d& xyz) //{ // Matrix3d mat_intrinsic; // cv2eigen(intrinsic, mat_intrinsic); // //(u,v,1)^T = (1/Z) * K * (X,Y,Z)^T // auto result = (1.f / xyz[2]) * mat_intrinsic * (xyz);//解算前进行单位转换 // return Point2f(result[0], result[1]); //} //pnp位姿解算 void PNP(const cv::Mat & img, std::vector points , cv::Mat cam, cv::Mat dis){ //给PNP参考的世界坐标点 std::vector points_world; //顺时针的世界坐标 points_world = { {-161.5, 52.0, 0.0}, {161.5, 52.0, 0.0}, {167.5, -45.0, 0.0}, {-167.5, -45.0, 0.0}, {0.0, 0.0, 0.0} }; cv::Mat rVec = cv::Mat::zeros(3, 1, CV_64FC1); cv::Mat tVec = cv::Mat::zeros(3, 1, CV_64FC1); if(points.size() > 0) solvePnP(points_world, points, cam, dis, rVec, tVec, false, cv::SOLVEPNP_IPPE); // 提取旋转向量的分量 double xr = rVec.at(0); double yr = rVec.at(1); double zr = rVec.at(2); // 提取平移向量的分量 double xt = tVec.at(0); double yt = tVec.at(1); double zt = tVec.at(2); // 构造旋转向量和平移向量的字符串表示 std::string rvec_str = "rotation_vector: (" + std::to_string(xr) + ", " + std::to_string(yr) + ", " + std::to_string(zr) + ")"; std::string tvec_str = "translation_vector: (" + std::to_string(xt) + ", " + std::to_string(yt) + ", " + std::to_string(zt) + ")"; putText(img, rvec_str, cv::Point2f(5, 25), cv::FONT_HERSHEY_COMPLEX, 0.5, cv::Scalar(255,255,255), 1); putText(img, tvec_str, cv::Point2f(5, 50), cv::FONT_HERSHEY_COMPLEX, 0.5, cv::Scalar(255, 255, 255), 1); }