在opencv中对有界矩形进行排序
Sorting bounded rectangles in opencv
我有一组有界矩形作为向量中的 Rect。
vector(Rect) boundRect( contours.size() );
我想像下图那样对这些矩形进行排序
我已经尝试过使用下面的方法,但我没有收到我发布的图片中的订单。
stable_sort( boundRect.begin(), boundRect.end(), compareX_rect );
stable_sort( boundRect.begin(), boundRect.end(), compareY_rect );
bool compareX_rect(const Rect & a, const Rect &b) {
return a.x >= b.x;
}
bool compareY_rect(const Rect & a, const Rect &b) {
return a.y >= b.y;
}
有人可以帮我解决这个问题吗?提前致谢。
合并成单一排序,其中排序将首先比较 y 值,然后再比较 x 值:
编辑:修复了在编码场测试的排序:
bool compareFn(Rectangle* l, Rectangle* r) {
if(l->y == r->y) return l->x < r->x;
return (l->y < r->y);
}
为了减少噪声(取决于涉及的噪声量),您可以执行 floor 或 round 函数,或者计算 'cell' y 值是其中的一部分。只需增加单元格大小,直到它克服噪音:
float cellSize = 20.0f;
bool compareFn(Rectangle* l, Rectangle* r) {
float lCell = floorf(l->y / cellSize);
float rCell = floorf(r->y / cellSize);
if(lCell == rCell) return l->x < r->x;
return (lCell < rCell);
}
这是测试它的程序(没有降噪):
#include <iostream>
#include <vector>
#include <algorithm> // std::sort
using namespace std;
struct Rectangle {
float x;
float y;
float width;
float height;
Rectangle(float x_, float y_, float w_, float h_)
: x(x_)
, y(y_)
, width(w_)
, height(h_)
{}
};
bool compareFn(Rectangle* l, Rectangle* r) {
if(l->y == r->y) return l->x < r->x;
return (l->y < r->y);
}
int main()
{
vector<Rectangle*> rectangles;
for(int x=0; x<10; ++x) {
for(int y=0; y<10; ++y) {
Rectangle* rect = new Rectangle((9 - x) * 50, (9-y) * 50, 50, 50);
rectangles.push_back(rect);
}
}
printf("SORTING\n");
sort(rectangles.begin(), rectangles.end(), compareFn);
printf("RESULTS\n");
for(vector<Rectangle*>::iterator it=rectangles.begin(), end=rectangles.end(); it!=end; ++it) {
Rectangle* rect = *it;
printf("[%f, %f, %f, %f]\n", rect->x, rect->y, rect->width, rect->height);
}
return 0;
}
我有一组有界矩形作为向量中的 Rect。
vector(Rect) boundRect( contours.size() );
我想像下图那样对这些矩形进行排序
我已经尝试过使用下面的方法,但我没有收到我发布的图片中的订单。
stable_sort( boundRect.begin(), boundRect.end(), compareX_rect );
stable_sort( boundRect.begin(), boundRect.end(), compareY_rect );
bool compareX_rect(const Rect & a, const Rect &b) {
return a.x >= b.x;
}
bool compareY_rect(const Rect & a, const Rect &b) {
return a.y >= b.y;
}
有人可以帮我解决这个问题吗?提前致谢。
合并成单一排序,其中排序将首先比较 y 值,然后再比较 x 值:
编辑:修复了在编码场测试的排序:
bool compareFn(Rectangle* l, Rectangle* r) {
if(l->y == r->y) return l->x < r->x;
return (l->y < r->y);
}
为了减少噪声(取决于涉及的噪声量),您可以执行 floor 或 round 函数,或者计算 'cell' y 值是其中的一部分。只需增加单元格大小,直到它克服噪音:
float cellSize = 20.0f;
bool compareFn(Rectangle* l, Rectangle* r) {
float lCell = floorf(l->y / cellSize);
float rCell = floorf(r->y / cellSize);
if(lCell == rCell) return l->x < r->x;
return (lCell < rCell);
}
这是测试它的程序(没有降噪):
#include <iostream>
#include <vector>
#include <algorithm> // std::sort
using namespace std;
struct Rectangle {
float x;
float y;
float width;
float height;
Rectangle(float x_, float y_, float w_, float h_)
: x(x_)
, y(y_)
, width(w_)
, height(h_)
{}
};
bool compareFn(Rectangle* l, Rectangle* r) {
if(l->y == r->y) return l->x < r->x;
return (l->y < r->y);
}
int main()
{
vector<Rectangle*> rectangles;
for(int x=0; x<10; ++x) {
for(int y=0; y<10; ++y) {
Rectangle* rect = new Rectangle((9 - x) * 50, (9-y) * 50, 50, 50);
rectangles.push_back(rect);
}
}
printf("SORTING\n");
sort(rectangles.begin(), rectangles.end(), compareFn);
printf("RESULTS\n");
for(vector<Rectangle*>::iterator it=rectangles.begin(), end=rectangles.end(); it!=end; ++it) {
Rectangle* rect = *it;
printf("[%f, %f, %f, %f]\n", rect->x, rect->y, rect->width, rect->height);
}
return 0;
}