Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ opencv中有界矩形的排序_C++_Opencv - Fatal编程技术网

C++ opencv中有界矩形的排序

C++ opencv中有界矩形的排序,c++,opencv,C++,Opencv,我有一组有界矩形作为向量中的矩形 vector(Rect) boundRect( contours.size() ); 我想对这些矩形进行排序,如下图所示 我已经尝试过使用下面的方法,但是我没有得到像我发布的图片中那样的顺序 stable_sort( boundRect.begin(), boundRect.end(), compareX_rect ); stable_sort( boundRect.begin(), boundRect.end(), compareY_rect ); bo

我有一组有界矩形作为向量中的矩形

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);
}
bool compareFn(矩形*l,矩形*r){
如果(l->y==r->y)返回l->xx;
返回(l->yy);
}
为了减少噪音(取决于噪音的大小),你可以做一个地板或圆形函数,或者计算一个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);
}
float cellSize=20.0f;
布尔比较n(矩形*l,矩形*r){
浮动lCell=地板(l->y/单元尺寸);
浮动rCell=地板(r->y/单元尺寸);
if(lCell==rCell)返回l->xx;
返回(lCell
下面是测试它的程序(没有降噪):

#包括
#包括
#include//std::sort
使用名称空间std;
结构矩形{
浮动x;
浮动y;
浮动宽度;
浮动高度;
矩形(浮动x、浮动y、浮动w、浮动h)
:x(x_)
,y(y_)
,宽度(w)
,高度(h)
{}
};
布尔比较n(矩形*l,矩形*r){
如果(l->y==r->y)返回l->xx;
返回(l->yy);
}
int main()
{
向量矩形;
用于(INTX=0;xy,矩形->宽度,矩形->高度);
}
返回0;
}

如果同一行的y坐标内有一些小噪音,则不起作用,是吗?正确,如果有噪音,只需在y坐标上做一个圆或地板功能即可。或者甚至在比较中添加一个噪声阈值。我尝试使用了您建议的使用楼层功能的方法。它仍然不起作用。你能发布你得到的结果吗?其思想是:同一行上的矩形应按x排序,不同行上的矩形应按y排序。因此,如果你有噪声,你必须减少足够的噪声,使同一行矩形在y上匹配。我亲自测试了排序。我有正确的概念,只是实现的逻辑有点错误:)这个fn更清晰。从字面上看,如果y相同,那么在x上比较,否则在y上比较。这为我打印了正确的订单。我修改了我原来的帖子。
#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;
}