捕捉移动点时, 我们可以使用一种叫做 光学流动(optical flow) 的算法, 在关键点的周围, 所有点的流动导数都是相同的, 从而我门可以判断出关键点( feature points)
下面是代码:
classCameraCaliberator
{
vector<vector<Point3f>> objectPoints;
// the real points
vector<vector<Point2f>> imagePoints;
// points found inimage
Mat cameraMatrix;
Mat distCoeffs;
int flag;
Mat map1, map2;
bool mustInitUndistort;
public:
CameraCaliberator() :flag(0), mustInitUndistort(true)
{
};
int addChessboardPoints(
const vector<string>& filelist, Size &boardSize){
vector<Point2f> imageCorners;
vector<Point3f> objectCorners;
for (int i = 0; i < boardSize.height;i++)
{
for (int j = 0; j < boardSize.width;j++)
{
objectCorners.push_back(Point3f(i, j,0.0f));
}
}
Mat image;
int successes = 0;
for (int i = 0; i < filelist.size();i++)
{
image = imread(filelist[i], 0);
bool found = findChessboardCorners(image, boardSize, imageCorners);
cornerSubPix(image, imageCorners, Size(5, 5), Size(-1, -1),
TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 30, 0.1));
//used to define when to stop
if (imageCorners.size() == boardSize.area())
{
addPoints(imageCorners, objectCorners);
successes++;
}
}
return successes;
}
double calibrate(Size &imageSize){
mustInitUndistort = true;
vector<Mat> rvecs, tvecs;
return calibr