2012-01-12 13 views
9

en OpenCV 2 y posterior hay el método Mat::resize que le permite agregar cualquier número de filas con el valor predeterminado a su matriz, ¿existe algún método equivalente para la columna? y si no, ¿cuál es la forma más eficiente de hacerlo? GraciasOpenCV Agregue columnas a una matriz

+0

que tenía una mirada al documento en línea y parece que no tiene una función para añadir columnas. http://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html?highlight=mat#Mat::resize –

Respuesta

25

Uso cv::hconcat:

Mat mat; 
Mat cols; 

cv::hconcat(mat, cols, mat); 
+4

Y no intente encontrar documentos para esta función. No está documentado. –

+1

El código de encabezado está aquí: https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core.hpp#L968. Para completar, la concatinación vertical se puede hacer con 'vconcat()' y también 'cv :: Mat :: push_back()' –

+0

Documentación: http://docs.opencv.org/trunk/d2/de8/group__core__array.html –

3

Peor escenario: rotate the image by 90 degrees y use Mat::resize(), haciendo que las columnas se conviertan en filas.

+0

Ok, pero ese es el peor de los casos, ¿qué pasa si mi Mat contiene CV_64FC1 y el tamaño es demasiado grande (500 * 500) y tengo que hacer esto para un gran número de matrices, así que no quiero incluir el proceso de rotación o transposición dos veces de matrices tan grandes en el algoritmo. – AMCoded

+5

Como dije, ** peor caso **. Si supiera el mejor caso, lo habría compartido contigo. – karlphillip

2

Como OpenCV almacena elementos de las filas de la matriz secuencialmente, uno tras otro no hay un método directo para aumentar el tamaño de la columna, pero me brindo dos soluciones para el asunto anterior, Primero use el siguiente método (el orden de los elementos de copia es menos que otros métodos), también podría usar un método similar si quiere insertar algunas filas o columnas no específicamente al final de las matrices.

void resizeCol(Mat& m, size_t sz, const Scalar& s) 
{ 
    Mat tm(m.rows, m.cols + sz, m.type()); 
    tm.setTo(s); 
    m.copyTo(tm(Rect(Point(0, 0), m.size()))); 
    m = tm; 
} 

Y el otro, si usted insiste no incluir incluso la copia de orden de los datos en sus algoritmos, entonces es mejor para crear su matriz con el gran número de filas y columnas y empezar el algoritmo con la submatriz más pequeño aumente el tamaño de su matriz por el método Mat::adjustROI.

Cuestiones relacionadas