Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 校准相机后无法恢复图像点的原始值_C++_Opencv_Camera Calibration - Fatal编程技术网

C++ 校准相机后无法恢复图像点的原始值

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,

在使用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, 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]