摄像机标定需要用到的数据有:图像的大小,特征点的图像坐标,特征点的世界坐标
saveFeaturePoints函数实现功能:
特征提取后存为文档,为了兼容,最好存为.yaml或.xml格式。但是下面的函数可以存储成任意后缀名,可以“发明”自己的后缀名,用eltraEdit都可以打开。
readFeaturePoints函数可以把数据读出来,以便后面的处理。
例如
int _tmain(int argc, char** argv )
{
vector<Point2f> imagePt;
vector<Point3f> objectPt;
for(int i=0;i<10;i++)
{
imagePt.push_back(Point2f(12.345,54.321));
objectPt.push_back(Point3f(12.345,54.321,67.890));
}
saveFeaturePoints("wyx.yaml",imagePt,objectPt);
vector<Point2f> imagePt1;
vector<Point3f> objectPt1;
readFeaturePoints("wyx.yaml",imagePt1,objectPt1);
saveFeaturePoints("wyx1read.yaml",imagePt1,objectPt1);
}
void saveFeaturePoints(
const string& fileName,
// Size iSize,
vector<Point2f> imagePt,
vector<Point3f> objectPt
)
{
//Save feature points to FILE
FileStorage fs(fileName, FileStorage::WRITE );
//fs << "image_width" << iSize.width;
//fs << "image_height" << iSize.height;
fs << "image_points" << Mat(imagePt);
fs << "object_points" <<Mat(objectPt);
}
bool readFeaturePoints(
const string& fileName,
//Size &iSize,
vector<Point2f> &imagePt,
vector<Point3f> &objectPt
)
{
FileStorage fs(fileName, FileStorage::READ);
if (!fs.isOpened())
return false;
// imagePt.resize(0);
// objectPt.resize(0);
// fs["image_width"] >> iSize.width;
// fs["image_height"] >> iSize.height;
Mat imagePtMat;
fs["image_points"] >> imagePtMat;
imagePt=Mat_<Point2f>(imagePtMat);
Mat objectPtMat;
fs["object_points"] >> objectPtMat;
objectPt=Mat_<Point3f>(objectPtMat);
return true;
}