Tamanho da Matriz OpenCV


128

Eu sei que isso pode ser muito rudimentar, mas eu sou novo no OpenCV. Você poderia me dizer como obter o tamanho de uma matriz no OpenCV ?. Pesquisei no Google e ainda estou pesquisando, mas se algum de vocês souber a resposta, ajude-me.

Tamanho como no número de linhas e colunas.

E existe uma maneira de obter diretamente o valor máximo de uma matriz 2D?

Respostas:


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

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

Observe também que stride> = cols; isso significa que o tamanho real da linha pode ser maior que o tamanho do elemento x colunas. Isso é diferente da questão do Mat contínuo e está relacionado ao alinhamento de dados.



1
São esses dois equivalentes exatos?
Cacahuete Frito 9/03

19

Observe que, além das linhas e colunas, há vários canais e tipos. Quando fica claro que tipo é, os canais podem atuar como uma dimensão extra, como em CV_8UC3, para que você endereça uma matriz como

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

Portanto, o tamanho em termos de elementos do tipo elementar é M.rows * M.cols * M.cn

Para encontrar o elemento máximo que se pode usar

Mat src;
double minVal, maxVal;
minMaxLoc(src, &minVal, &maxVal);

Esta é a única resposta que também aborda encontrar o maior elemento em um OpenCV Mat.
rayryeng

12

Para matriz 2D:

mat.rows - Número de linhas em uma matriz 2D.

mat.cols - Número de colunas em uma matriz 2D.

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

O método retorna um tamanho de matriz: Size (colunas, linhas). Quando a matriz é mais do que bidimensional, o tamanho retornado é (-1, -1).

Para matriz multidimensional, você precisa 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;

Observe, aqui 2 para o eixo z, 3 para o eixo y, 4 para o eixo x. Por x, y, z, significa a ordem das dimensões. O índice x muda o mais rápido.


1
só para esclarecer, não há Mat::size()método membro, mas uma Mat::sizevariável membro do tipo MatSize. O último sobrecarrega o operador de parênteses MatSize::operator()para retornar um Sizeobjeto
Amro

4

Um exemplo completo de código C ++ pode ser útil para iniciantes

#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;
}

1
como obtemos a profundidade da matriz no cpp?
sai

1

Se você estiver usando os wrappers Python, (assumindo que o nome da sua matriz seja mat ):

  • mat.shape fornece uma matriz do tipo- [altura, largura, canais]

  • mat.size fornece o tamanho da matriz

Código de amostra:

import cv2
mat = cv2.imread('sample.png')
height, width, channel = mat.shape[:3]
size = mat.size
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.