矢量的类定义

时间:2012-10-11 21:50:06

标签: c++ opencv vector

以下是我将边界框划分为较小部分的过程。

class reticula
{   
    int _columnas;
    int _renglones;
    int _num_pixelotes;
    vector<vector<Point> > Pixelotes;

public:
reticula():
_columnas(0),
_renglones(0),
_num_pixelotes(0),
Pixelotes(){};
/// crear la reticula con los valores deseados 
reticula(vector<Point> verticesB, int renglon, int columna);

Size size(void);
vector<Point> en(int el_renglon, int la_columna);
~reticula(void);
};  

reticula::reticula(vector<Point> verticesB, int renglon, int columna ){
if(verticesB.size()!= 4){
    cout<< "El vector debe tener las 4 esquinas del rectangulo a dividir"
        << endl;    
    throw 400; // es para mandar la exepción. 
}
_columnas = columna;
_renglones = renglon;
_num_pixelotes = columna * renglon ;
Pixelotes.resize(_renglones * _columnas); 
double dis_mayor, dis_menor;//con respecto a los ejes 
Point dif_10;
Point dif_21;
Point dif_32;
Point dif_03;
double es_mayor, es_menor;


dif_10 = verticesB[1]-verticesB[0];
dif_21 = verticesB[2]-verticesB[1];
dif_32 = verticesB[3]-verticesB[2];
dif_03 = verticesB[0]-verticesB[3];

dis_mayor = norm(dif_10);
dis_menor = norm(dif_21);

es_mayor = dis_mayor/(double) _columnas;
es_menor = dis_menor/(double) _renglones;
Point aux;
Point aux2;
vector<Point> vertices_re((_columnas + 1)*(_renglones + 1));
for (int i = 0; i < _renglones; i++){
    for(int j= 0; j < _columnas; j++){
        for(int h=0; h < 4; h++ ){
            aux = verticesB[0] + ((((double)j*dis_mayor) * dif_10) + (((double)i * dis_menor)*dif_21));
            if(h=0){aux2= aux;}
            else if(h=1){aux2= aux + (dis_mayor * dif_10);}
            else if(h=2){aux2= aux + (dis_mayor * dif_10) + (dis_menor * dif_21);}
            else if(h=3){aux2= aux + (dis_menor * dif_21);}
            Pixelotes[i * _columnas + j].push_back(aux2);
        }
    }
}


}


Size reticula::size(void){
Size Total;
Total.width = _columnas;
Total.height = _renglones;
return Total;

}

vector<Point> reticula::en(int el_renglon, int la_columna){
if(el_renglon > _renglones|| la_columna> _columnas){
    cout << " el renglon y la columna se deben encontrar dentro de los parametros "
        <<endl;
    cout<< _renglones<<" , "<<_columnas<<endl;
    vector<Point> vacio;
    vacio.push_back(Point(0,0));
    return (vacio);
}
int busca;
busca = el_renglon * _columnas + la_columna;    
}

我想创建一个包含这个类的向量,但我不知道我做错了什么

vector<reticula> SoloReti(contours.size());
for(int g=0; g< SoloReti.size(); g++){
    SoloReti[g].reticula(contours[g], 5,4);
}

g ++编译器告诉“无效使用网状网::网状网”有人能告诉我问题在哪里吗?

2 个答案:

答案 0 :(得分:1)

当您声明vector<reticula> SoloReti(contours.size())时,它会使用默认构造函数contours.size()初始化带有reticula()网格构建的向量。

执行SoloReti[g].reticula时,您试图从已构造的对象中调用构造函数。解决方案:使用赋值运算符:

vector<reticula> SoloReti(contours.size());
for(int g=0; g< SoloReti.size(); g++){
    SoloReti[g] = reticula(contours[g], 5,4);
}

答案 1 :(得分:0)

我认为这就是你想要的:

vector<reticula> SoloReti;

for(int g = 0; g < countors.size(); g++)
{
    reticula tmp(contours[g], 5, 4); 
    SoloReti.push_back(tmp);
}