根据四个点坐标排列出左上右上右下左下位置关系
生活随笔
收集整理的這篇文章主要介紹了
根据四个点坐标排列出左上右上右下左下位置关系
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
根據四個點坐標排列出左上右上右下左下位置關系
基本思路是:
先計算出這四個點的中心位置,然后根據中心位置來做判斷。
那么中心位置就是把他們四個點的坐標全部加起來再除以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 pointsfor (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 pointsPoint2f 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度才能滿足我們的需求。
總結
以上是生活随笔為你收集整理的根据四个点坐标排列出左上右上右下左下位置关系的全部內容,希望文章能夠幫你解決所遇到的問題。