根据四个点坐标排列出左上右上右下左下位置关系

根据四个点坐标排列出左上右上右下左下位置关系

基本思路是:
先计算出这四个点的中心位置,然后根据中心位置来做判断。
那么中心位置就是把他们四个点的坐标全部加起来再除以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度才能满足我们的需求。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值