二维图像坐标排序(转载)

转载:

#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
 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值