Tamaño de Matrix OpenCV

128

Sé que esto puede ser muy rudimentario, pero soy nuevo en OpenCV. ¿Podría decirme cómo obtener el tamaño de una matriz en OpenCV? Busqué en Google y todavía estoy buscando, pero si alguno de ustedes sabe la respuesta, por favor ayúdenme.

Tamaño como en número de filas y columnas.

¿Y hay alguna manera de obtener directamente el valor máximo de una matriz 2D?

Lakshmi Narayanan
fuente

Respuestas:

239
cv:Mat mat;
int rows = mat.rows;
int cols = mat.cols;

cv::Size s = mat.size();
rows = s.height;
cols = s.width;

También tenga en cuenta que stride> = cols; Esto significa que el tamaño real de la fila puede ser mayor que el tamaño del elemento x cols. Esto es diferente del problema de Mat continuo y está relacionado con la alineación de datos.

Michael O
fuente
1
¿Son esos dos equivalentes exactos?
Cacahuete Frito
19

Tenga en cuenta que, aparte de las filas y columnas, hay varios canales y tipos. Cuando está claro qué tipo es, los canales pueden actuar como una dimensión adicional como en CV_8UC3, por lo que abordaría una matriz como

uchar a = M.at<Vec3b>(y, x)[i];

Entonces el tamaño en términos de elementos de tipo elemental es M.rows * M.cols * M.cn

Para encontrar el elemento máximo uno puede usar

Mat src;
double minVal, maxVal;
minMaxLoc(src, &minVal, &maxVal);
Vlad
fuente
Esta es la única respuesta que también aborda la búsqueda del elemento más grande en un tapete OpenCV.
rayryeng
12

Para matriz 2D:

mat.rows: número de filas en una matriz 2D.

mat.cols: número de columnas en una matriz 2D.

O: C ++: Size Mat :: size () const

El método devuelve un tamaño de matriz: Tamaño (cols, filas). Cuando la matriz es más de 2 dimensiones, el tamaño devuelto es (-1, -1).

Para la matriz multidimensional, debe usar

int thisSizes[3] = {2, 3, 4};
cv::Mat mat3D(3, thisSizes, CV_32FC1);
// mat3D.size tells the size of the matrix 
// mat3D.size[0] = 2;
// mat3D.size[1] = 3;
// mat3D.size[2] = 4;

Tenga en cuenta que aquí 2 para el eje z, 3 para el eje y, 4 para el eje x. Por x, y, z, significa el orden de las dimensiones. El índice x cambia más rápido.

usuario1914692
fuente
1
Para ser claros, no hay un Mat::size()método miembro, sino una Mat::sizevariable miembro de tipo MatSize. Este último sobrecarga al operador de paréntesis MatSize::operator()para devolver un Sizeobjeto
Amro
4

Un ejemplo completo de código C ++ puede ser útil para los principiantes.

#include <iostream>
#include <string>
#include "opencv/highgui.h"

using namespace std;
using namespace cv;

int main()
{
    cv:Mat M(102,201,CV_8UC1);
    int rows = M.rows;
    int cols = M.cols;

    cout<<rows<<" "<<cols<<endl;

    cv::Size sz = M.size();
    rows = sz.height;
    cols = sz.width;

    cout<<rows<<" "<<cols<<endl;
    cout<<sz<<endl;
    return 0;
}
MARYLAND. Nazmul Kibria
fuente
1
¿Cómo obtenemos la profundidad de la matriz en cpp?
Sai
1

Si está utilizando los envoltorios de Python, entonces (suponiendo que el nombre de su matriz sea mat ):

  • mat.shape le proporciona una matriz del tipo- [alto, ancho, canales]

  • mat.size te da el tamaño de la matriz

Código de muestra:

import cv2
mat = cv2.imread('sample.png')
height, width, channel = mat.shape[:3]
size = mat.size
nimesh00
fuente