本文主要涉及基于RANSAC算法的放射变换的研究,不足之处一起谈论,多多包涵。
目前完成仿射变换部分,RANSAC算法部分仍在思考。
1、仿射矩阵的求解
原理:
6个参数,故需三对点即可求解。
Mat Affine2DEstimatorp(Point2d point1, Point2d point2, Point2d point3, Point2d pointa, Point2d pointb, Point2d pointc) //point1、pint2和point3分别于pointa、pointb和pointc对应
{
Mat affine(Size(3, 2), CV_64FC1); //仿射矩阵
affine.at<double>(0, 1) = (point1.x*(pointb.x - pointc.x) + point2.x*(pointc.x - pointa.x) + point3.x*(pointa.x - pointb.x)) / (point1.x*(point2.y - point3.y) + point2.x*(point3.y - point1.y) + point3.x*(point1.y - point2.y));
affine.at<double>(0, 0) = (pointa.x - pointb.x - affine.at<double>(0, 1)*(point1.y - point2.y)) / (point1.x - point2.x);
affine.at<double>(0, 2) = pointa.x - point1.x*affine.at<double>(0, 0) - point1.y*affine.at<double>(0, 1);
affine.at<double>(1, 1) = (point1.x*(pointb.y - pointc.y) + point2.x*(pointc.y - pointa.y) + point3.x*(pointa.y - pointb.y)) / (point1.x*(point2.y - point3.y) + point2.x*(point3.y - point1.y) + point3.x*(point1.y - point2.y));
affine.at<double>(1, 0) = (pointa.y - pointb.y - affine.at<double>(1, 1)*(point1.y - point2.y)) / (point1.x - point2.x);
affine.at<double>(1, 2) = pointa.y - point1.x*affine.at<double>(1, 0) - point1.y*affine.at<double>(1, 1);
cout << affine << endl;
return affine;
}
2、利用仿射矩阵求估计点
Point2d Affine(Mat affine, Point2d picPoint)
{
if (affine.cols != 3 && affine.rows != 2)
cout << "ERROR:仿射矩阵大小不符!";
Point2d predictPoint;
predictPoint.x = affine.at<double>(0, 0)*picPoint.x + affine.at<double>(0, 1)*picPoint.y + affine.at<double>(0, 2);
predictPoint.y = affine.at<double>(1, 0)*picPoint.x + affine.at<double>(1, 1)*picPoint.y + affine.at<double>(1, 2);
return predictPoint;
}
3、两点间的欧式距离
double Distination(Point2d predictPoint, Point2d realPoint)
{
return sqrt((predictPoint.x - realPoint.x)*(predictPoint.x - realPoint.x) + (predictPoint.y - realPoint.y)*(predictPoint.y - realPoint.y));
}
4、数组随机取元素
void randArry()
{
double arry[] = { 2,5,4,7,8,9,6 };
int a,len = sizeof(arry)/ sizeof(arry[0]);
cout << len << endl;
srand(time(NULL));
while (1)
{
a = rand() % len;
cout << arry[a] << " ";
Sleep(100);
}
}
源代码:https://download.csdn.net/download/qq_34902877/10434347