我正在研究C ++中的OpenCV代码,它基本上试图检测图像中页面的边界点。我使用findCountours()函数来查找轮廓,然后,我尝试使用approxPolyDP()函数查找四边形,并仅考虑仅有4个点的四边形。我的代码主要基于OpenCV样本中的squares.cpp代码。
它工作并返回4分。我很开心......但这种快乐并不会持久。 :(我很快意识到返回点的顺序似乎是随机的(对于不同的图像不同)。我希望算法仅以特定顺序返回4点(例如,左上角,然后右上角) ,然后是右下角,然后是左下角。
以相同的固定顺序获取点对于我的应用程序至关重要,因此,我的问题是“是否有任何方法可以修复算法检测和返回这些点的顺序”(代码几乎与OpenCV的squares.cpp示例)。任何帮助将非常感激。 不言而喻,TIA。 :d
答案 0 :(得分:0)
如果pointsVector
类型为vector<cv::Point>
并且它具有您需要的矩形或正方形的四个坐标,请使用以下代码。
struct sortY {
bool operator() (cv::Point pt1, cv::Point pt2) { return (pt1.y < pt2.y);}
} mySortY;
struct sortX {
bool operator() (cv::Point pt1, cv::Point pt2) { return (pt1.x < pt2.x);}
} mySortX;
std::sort(pointsVector.begin(),pointsVector.end(),mySortY);
std::sort(pointsVector.begin(),pointsVector.begin()+2,mySortX);
std::sort(pointsVector.begin()+2,pointsVector.end(),mySortX);
以上代码将按以下顺序对pointsVector
进行排序:topLeft, topRight, bottomLeft, bottomRight