Dimensione della matrice OpenCV


128

So che potrebbe essere molto rudimentale, ma sono nuovo di OpenCV. Potresti dirmi come ottenere le dimensioni di una matrice in OpenCV ?. Ho cercato su Google e sto ancora cercando, ma se qualcuno di voi conosce la risposta, per favore aiutatemi.

Dimensioni come in numero di righe e colonne.

E c'è un modo per ottenere direttamente il valore massimo di una matrice 2D?

Risposte:


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

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

Si noti inoltre che passo> = cols; ciò significa che la dimensione effettiva della riga può essere maggiore della dimensione dell'elemento x cols. Ciò è diverso dal problema del tappetino continuo ed è correlato all'allineamento dei dati.



1
Sono quei due equivalenti esatti?
Cacahuete Frito,

19

Nota che oltre a righe e colonne c'è un numero di canali e tipi. Quando è chiaro di che tipo è, i canali possono agire come una dimensione aggiuntiva come in CV_8UC3 in modo da indirizzare una matrice come

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

Quindi la dimensione in termini di elementi di tipo elementare è M.rows * M.cols * M.cn

Per trovare l'elemento massimo si può usare

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

Questa è l'unica risposta che affronta anche la ricerca dell'elemento più grande in un tappetino OpenCV.
Rayryeng,

12

Per matrice 2D:

mat.rows - Numero di righe in un array 2D.

mat.cols - Numero di colonne in un array 2D.

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

Il metodo restituisce una dimensione matrice: Dimensione (colonne, righe). Quando la matrice è più di 2 dimensioni, la dimensione restituita è (-1, -1).

Per la matrice multidimensionale, è necessario utilizzare

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;

Nota, qui 2 per l'asse z, 3 per l'asse y, 4 per l'asse x. Per x, y, z, significa l'ordine delle dimensioni. L'indice x cambia più velocemente.


1
per essere chiari, non esiste un Mat::size()metodo membro, piuttosto una Mat::sizevariabile membro di tipo MatSize. Quest'ultimo sovraccarica l'operatore tra parentesi MatSize::operator()per restituire un Sizeoggetto
Amro

4

Un esempio di codice C ++ completo può essere utile per i principianti

#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
come otteniamo la profondità della matrice in cpp?
Sai

1

Se si utilizzano i wrapper Python, quindi (supponendo che il nome della matrice sia opaco ):

  • mat.shape ti offre una matrice del tipo- [altezza, larghezza, canali]

  • mat.size ti dà la dimensione dell'array

Codice di esempio:

import cv2
mat = cv2.imread('sample.png')
height, width, channel = mat.shape[:3]
size = mat.size
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.