最小二乘法求仿射变换参数,并剔除误差较大的点

来源:互联网 发布:java实验fan 编辑:程序博客网 时间:2024/06/04 18:12

struct sort_value
{
Point2f pt;
double value;
};

//降序排列
bool greaterCompare(const sort_lp& str1, const sort_lp& str2)
{
return str1.value > str2.value;
}

// 排序,仿射变换去除误差大的点
vector L_Affine;
for (int i = 0; i < q; i++)
{
Mat_ pp = Mat(2,1,CV_32FC1,Scalar(0));
Point2f PP1;
Mat_ temp = Mat(3,1, CV_32FC1, cv::Scalar(0));
temp(0, 0) = L_P_2[i].x;
temp(1, 0) = L_P_2[i].y;
temp(2, 0) = 1;
pp = F1 * temp;
PP1.x = pp.at(0, 0);
PP1.y = pp.at(1, 0);
L_Affine.push_back(PP1);
}
double aa = 0;
vector final;
for (int j = 0; j < q; j++)
{
sort_lp sort1;
double d = (L_Affine[j].x - R_P_2[j].x)(L_Affine[j].x - R_P_2[j].x) + (L_Affine[j].y - R_P_2[j].y)(L_Affine[j].y - R_P_2[j].y);
sort1.i = j; sort1.value = d;
final.push_back(sort1);
aa = aa + d;
}
sort(final.begin(), final.end(), greaterCompare); //降序排列
double c = sqrt(aa/q);
while (c > 10)
{
final.erase(final.begin());
c = 0;
for (vector::iterator iter = final.begin(); iter != final.end(); iter++)
{
c = c + (L_Affine[(iter).i].x - R_P_2[(*iter).i].x)(L_Affine[(iter).i].x - R_P_2[(*iter).i].x) + (L_Affine[(*iter).i].y - R_P_2[(*iter).i].y)(L_Affine[(*iter).i].y - R_P_2[(*iter).i].y);
}
c = sqrt(c/ final.size());
}
vector L_Aff;
vector R_Aff;
for (vector::iterator itera2 = final.begin(); itera2 != final.end(); itera2++)
{
L_Aff.push_back(L_P_2[(*itera2).i]);
R_Aff.push_back(R_P_2[(*itera2).i]);
}

当初始点内存在大量误匹配时,求出的仿射变换参数会有错误

-edit

0 0
原创粉丝点击