根据四个点坐标排列出左上右上右下左下位置关系
基本思路是:
先计算出这四个点的中心位置,然后根据中心位置来做判断。
那么中心位置就是把他们四个点的坐标全部加起来再除以4。
然后根据点的y坐标值,与中心点y的值比较。大于中心点坐标y的为底下。
小于中心点坐标y的为顶上。(x是向右的,y坐标是向下的)
区分好了上下之后,再在上下的点集分别分出左右来。
x坐标小于中心点就是左,x坐标大于中心点就是右
整个算法代码如下:
#include <io.h>
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <cstring>
using namespace cv;
using namespace std;
void sortFourPoints(vector<Point2f>& FourPoints)
{
vector<Point2f> top,bottom;
Point2f center={0,0}
//to confirm it is the 4 pointer. else return
if(FourPoints.size()!=4)return;
//first to locate the center point.
for (int i = 0;i < 4;i++)
{
center += FourPoints[i];
}
center =center/4.;
//to sort the two top points and two bottom points
for (int i =0;i< 4;i++)
{
if (FourPoints[i].y<center.y)
{
top.push_back(FourPoints[i]);
}
else
{
bottom.push_back(FourPoints[i]);
}
}
//to sort the two left points and two right points
Point2f topleft = top[0].x > center.x ? top[1] : top[0];
Point2f topright = top[0].x > center.x ? top[0] : top[1];
Point2f bottomleft = bottom [0].x > center.x ? bottom [1] : bottom [0];
Point2f bottomright = bottom [0].x > center.x ? bottom [0] : bottom [1];
//clear the FourPoints vector.
FourPoints.clear();
//update the FourPoints vector to correct order
FourPoints.push_back(topleft);
FourPoints.push_back(topright);
FourPoints.push_back(bottomright);
FourPoints.push_back(bottomleft);
}
另外需要注意:
这样排列的坐标关系,有时候需要再转个90度才能满足我们的需求。