Taille de la matrice OpenCV

128

Je sais que cela peut être très rudimentaire, mais je suis nouveau sur OpenCV. Pourriez-vous s'il vous plaît me dire comment obtenir la taille d'une matrice dans OpenCV ?. J'ai cherché sur Google et je suis toujours à la recherche, mais si l'un d'entre vous connaît la réponse, aidez-moi s'il vous plaît.

Taille en nombre de lignes et de colonnes.

Et existe-t-il un moyen d'obtenir directement la valeur maximale d'une matrice 2D?

Lakshmi Narayanan
la source

Réponses:

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

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

Notez également que stride> = cols; cela signifie que la taille réelle de la ligne peut être supérieure à la taille de l'élément x cols. Ceci est différent du problème du tapis continu et est lié à l'alignement des données.

Michael O
la source
1
Ces deux équivalents sont-ils exacts?
Cacahuete Frito
19

Notez qu'en dehors des lignes et des colonnes, il existe un certain nombre de canaux et de types. Quand le type est clair, les canaux peuvent agir comme une dimension supplémentaire comme dans CV_8UC3, donc vous adresseriez une matrice comme

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

Donc la taille en termes d'éléments de type élémentaire est M.rows * M.cols * M.cn

Pour trouver l'élément maximum, on peut utiliser

Mat src;
double minVal, maxVal;
minMaxLoc(src, &minVal, &maxVal);
Vlad
la source
C'est la seule réponse qui aborde également la recherche du plus grand élément dans un tapis OpenCV.
rayryeng
12

Pour la matrice 2D:

mat.rows - Nombre de lignes dans un tableau 2D.

mat.cols - Nombre de colonnes dans un tableau 2D.

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

La méthode renvoie une taille de matrice: Size (cols, rows). Lorsque la matrice est supérieure à 2 dimensions, la taille renvoyée est (-1, -1).

Pour une matrice multidimensionnelle, vous devez utiliser

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;

Notez, ici 2 pour l'axe z, 3 pour l'axe y, 4 pour l'axe x. Par x, y, z, cela signifie l'ordre des dimensions. x index change le plus rapidement.

user1914692
la source
1
pour être clair, il n'y a pas de Mat::size()méthode membre, mais plutôt une Mat::sizevariable membre de type MatSize. Ce dernier surcharge l'opérateur parenthèses MatSize::operator()pour renvoyer un Sizeobjet
Amro
4

Un exemple de code C ++ complet peut être utile pour les débutants

#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
la source
1
comment obtenir la profondeur de la matrice dans cpp?
sai
1

Si vous utilisez les wrappers Python, alors (en supposant que votre nom de matrice est mat ):

  • mat.shape vous donne un tableau du type- [hauteur, largeur, canaux]

  • mat.size vous donne la taille du tableau

Exemple de code:

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