转载:
#include <vector>
using namespace std;
//对y方向上的点位进行排序
bool SetSortRule(const Point p1,const Point p2)
{
if(p1.x < p2.x)
return true;
else
return false;
}
//对x方向上的点位进行排序
bool SetSortRule1(const vector<Point> p1,const vector<Point> p2)
{
if(p1.at(0).y < p2.at(0).y)
return true;
else
return false;
}
vector<Point> posP;
posP.push_back(Point(4,2));
posP.push_back(Point(3,2));
posP.push_back(Point(2,2));
posP.push_back(Point(1,2));
posP.push_back(Point(4,1));
posP.push_back(Point(3,1));
posP.push_back(Point(2,1));
posP.push_back(Point(1,1));
posP.push_back(Point(2,4));
posP.push_back(Point(1,4));
posP.push_back(Point(3,3));
posP.push_back(Point(1,3));
posP.push_back(Point(4,3));
posP.push_back(Point(4,4));
posP.push_back(Point(3,4));
posP.push_back(Point(2,3));
我这边是手动push数据,也可以用for循环push
vector<vector<Point>> point_all;
vector<Point> point_row;
point_all.clear();
point_row.clear();
int IErr = 0; //同一行y坐标允许的误差值
for(unsigned int i = 0; i < posP.size();i++)
{
for(unsigned int j =i+1;j<posP.size();j++)
{
if(abs( posP.at(i).y - posP.at(j).y)<= IErr )
{
point_row.push_back(posP.at(j));
posP.erase(posP.begin()+j);
j--;
}
}
point_row.push_back(posP.at(i));//最后将比较的点放入Vector
cout << "size:" << point_row.size() << endl;
sort(point_row.begin(),point_row.end(),SetSortRule);//对同一行的点位进行排序
for(unsigned int k=0; k < point_row.size();k++)
cout << point_row.at(k)<< endl;
//将同一行的点位放入vector
point_all.push_back(point_row);
point_row.clear(); //清空,准备下一次排序
}
由于图像中同一行 实际的像素坐标在Y方向上存在一些误差,所以在误差范围内都认为是同一行。
即满足 abs(posP.at(i).y - posP.at(j).y) <=iErr 这个条件的坐标,都认为是同一行。
每次找到对应的坐标,都将坐标丢进 point_row,并将次坐标从posP中剔除,直到第二个for循环遍历完成,
然后将被比较的坐标丢进point_row,这样代表这一行Y方向相近的坐标,都被获取。
接下来对point_row这一行的坐标进行排序。
然后将排序后点vector丢进point_all中,将point_row清空准备下一次排序
cout << "before:" << endl;
for(unsigned int i=0; i < point_all.size();i++)
{
for(unsigned int j=0; j < point_all.at(i).size();j++)
{
cout << point_all.at(i).at(j)<<endl;
}
}
cout << "after:" << endl;
sort(point_all.begin(),point_all.end(),SetSortRule1);
for(unsigned int i=0; i < point_all.size();i++)
{
for(unsigned int j=0; j < point_all.at(i).size();j++)
{
cout << point_all.at(i).at(j)<<endl;
}
}
system("pause");
return 0;
}
本文链接:https://blog.csdn.net/jy_6666/article/details/105431952