C++ 校准相机后无法恢复图像点的原始值
在使用OpenCv的CalibleCamera方法校准相机并获取其参数后,当我尝试再现原始对象点时,我得到了无意义的输出。 这是我的密码:C++ 校准相机后无法恢复图像点的原始值,c++,opencv,camera-calibration,C++,Opencv,Camera Calibration,在使用OpenCv的CalibleCamera方法校准相机并获取其参数后,当我尝试再现原始对象点时,我得到了无意义的输出。 这是我的密码: vector<vector<cv::Point3f> > object_points; vector<vector<cv::Point2f> > image_points; cv::Mat cam_mat; cv::Mat dist_coeffs; vector<cv::Mat> rvecs,
vector<vector<cv::Point3f> > object_points;
vector<vector<cv::Point2f> > image_points;
cv::Mat cam_mat;
cv::Mat dist_coeffs;
vector<cv::Mat> rvecs, tvecs;
std::vector<cv::Point3f> t_3d;
t_3d.push_back(cv::Point3f(0.9, -3, 57.5));
t_3d.push_back(cv::Point3f(1.45, -3, 57.5));
t_3d.push_back(cv::Point3f(2, -3, 57.5));
t_3d.push_back(cv::Point3f(0.9, -3, 53));
t_3d.push_back(cv::Point3f(1.45, -3, 53));
t_3d.push_back(cv::Point3f(2, -3, 53));
object_points.push_back(t_3d);
std::vector<cv::Point2f> t_2d;
t_2d.push_back(cv::Point2f(434, 362));
t_2d.push_back(cv::Point2f(570, 362));
t_2d.push_back(cv::Point2f(706, 325));
t_2d.push_back(cv::Point2f(513, 574));
t_2d.push_back(cv::Point2f(513, 574));
t_2d.push_back(cv::Point2f(654, 557));
image_points.push_back(t_2d);
cv::calibrateCamera(object_points, image_points, cv::Size(1440, 900), cam_mat,
dist_coeffs, rvecs, tvecs, CV_CALIB_USE_INTRINSIC_GUESS);
cv::Mat tx(4, 1, CV_64F, cv::Scalar(1.0));
tx.at<double>(0, 0) = 0.9;
tx.at<double>(1, 0) = -3;
tx.at<double>(2, 0) = 57.5;
cv::Mat rrr ;
cv::projectPoints(object_points.at(0), rvecs.at(0), tvecs.at(0),cam_mat,
dist_coeffs, rrr);
怎么了 你得到的是一个非常不同的值,还是与期望值相似的值?你能试试std::vector rrr;取而代之的是,由于你提供了6个点,对象_点是一个带有6个点2f的向量,因此得到6个值并不奇怪,但我会期望得到一个6x2或2x6矩阵,因此可能Mat的格式出乎意料,可能这6个值中的每一个都是64位双精度,其中包含了点2f的两个32位值,双精度a=1.53232e+18;cv::Point2f*pt=cv::Point2f*&a;std::cout事实上你是在要求对象_points.at0,它是t_3d,它是一个6点的向量。尝试创建一个只有一个点的新向量,你会得到想要的结果。
rrr = [1.53232e+18, 1.08633e+18, 7.72618e+17, 7.09485e+19, 7.192e+19, 7.26505e+19]