2015-06-14 47 views
0

我試圖使用the following算法通過minAreaRect返回的結果進行排序:OpenCV的排序分

這裏是我的代碼現在:

void sortPoints(Point2f* unsorted) { 

    Point2f sorted[4]; 

    for (int i = 0; i < 4; i++) sorted[i] = Point(0, 0); 

    float middleX = (unsorted[0].x + unsorted[1].x + unsorted[2].x + unsorted[3].x)/4; 
    float middleY = (unsorted[0].y + unsorted[1].y + unsorted[2].y + unsorted[3].y)/4; 

    for (int i = 0; i < 4; i++) { 
     if (unsorted[i].x < middleX && unsorted[i].y < middleY) sorted[0] = unsorted[i]; 
     if (unsorted[i].x > middleX && unsorted[i].y < middleY) sorted[1] = unsorted[i]; 
     if (unsorted[i].x < middleX && unsorted[i].y > middleY) sorted[2] = unsorted[i]; 
     if (unsorted[i].x > middleX && unsorted[i].y > middleY) sorted[3] = unsorted[i]; 
    } 

    unsorted = sorted; 

} 

... 

vector<RotatedRect> minRect(contours.size()); 

for(int i = 0; i < contours.size(); i++) { 
    minRect[i] = minAreaRect(Mat(contours[i])); 
} 

Point2f rect_points[4]; 

for(int i = 0; i < contours.size(); i++) { 
    minRect[i].points(rect_points); 
    sortPoints(rect_points); /* ...they are not sorted after calling sortPoints?!? */ 
} 

但它不工作,沒有編譯錯誤,但點不排序。我認爲數據類型有問題。

+1

我不認爲這個算法排序您的數據! – Tempux

+0

我更新了我的問題,在那裏你可以看到原來的算法。 – vitozev

回答

3

您提供的算法僅適用於4個點屬於平行於x-y軸的矩形。您嘗試返回結果的方式也無法正常工作。嘗試將sorted陣列複製回unsorted。這樣for (int i=0;i<4;++i) unsorted[i] = sorted[i];

但有一定的方式,你可以使用

#include <algorithm> 
struct str{ 
    bool operator() (Point2f a, Point2f b){ 
     if (a.y != b.y) 
      return a.y < b.y; 
     return a.x <= b.x ; 
    } 
} comp; 

int main() 
{ 
Point2f v[4]; 
v[0] = Point2f(0,1); 
v[1] = Point2f(-1,1); 
v[2] = Point2f(2,1); 
v[3] = Point2f(4,1); 

sort(v,v+4,comp); 
}