Größe der Matrix OpenCV

128

Ich weiß, dass dies sehr rudimentär sein kann, aber ich bin neu bei OpenCV. Können Sie mir bitte sagen, wie ich die Größe einer Matrix in OpenCV erhalte? Ich habe gegoogelt und bin immer noch auf der Suche, aber wenn einer von Ihnen die Antwort kennt, helfen Sie mir bitte.

Größe wie in Anzahl der Zeilen und Spalten.

Und gibt es eine Möglichkeit, den Maximalwert einer 2D-Matrix direkt zu erhalten?

Lakshmi Narayanan
quelle

Antworten:

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

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

Beachten Sie auch, dass Schritt> = Spalten; Dies bedeutet, dass die tatsächliche Größe der Zeile größer sein kann als die Elementgröße x Spalten. Dies unterscheidet sich vom Problem der kontinuierlichen Matte und hängt mit der Datenausrichtung zusammen.

Michael O.
quelle
1
Sind das zwei exakte Äquivalente?
Cacahuete Frito
19

Beachten Sie, dass es neben Zeilen und Spalten eine Reihe von Kanälen und Typen gibt. Wenn klar ist, um welchen Typ es sich handelt, können die Kanäle wie in CV_8UC3 als zusätzliche Dimension fungieren, sodass Sie eine Matrix als adressieren würden

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

Die Größe in Bezug auf Elemente des Elementartyps ist also M.rows * M.cols * M.cn.

Um das maximale Element zu finden, kann man verwenden

Mat src;
double minVal, maxVal;
minMaxLoc(src, &minVal, &maxVal);
Vlad
quelle
Dies ist die einzige Antwort, die sich auch mit dem Finden des größten Elements in einer OpenCV-Matte befasst.
Rayryeng
12

Für 2D-Matrix:

mat.rows - Anzahl der Zeilen in einem 2D-Array.

mat.cols - Anzahl der Spalten in einem 2D-Array.

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

Die Methode gibt eine Matrixgröße zurück: Größe (Spalten, Zeilen). Wenn die Matrix mehr als zweidimensional ist, beträgt die zurückgegebene Größe (-1, -1).

Für mehrdimensionale Matrix müssen Sie verwenden

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;

Beachten Sie, hier 2 für die z-Achse, 3 für die y-Achse, 4 für die x-Achse. Mit x, y, z ist die Reihenfolge der Dimensionen gemeint. x Index ändert sich am schnellsten.

user1914692
quelle
1
Um ganz klar zu sein, es gibt keine Mat::size()Mitgliedsmethode, sondern eine Mat::sizeMitgliedsvariable vom Typ MatSize. Letzteres überlastet den Klammeroperator MatSize::operator(), um ein SizeObjekt zurückzugeben
Amro
4

Ein vollständiges C ++ - Codebeispiel kann für Anfänger hilfreich sein

#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;
}
MD. Nazmul Kibria
quelle
1
Wie erhalten wir die Tiefe der Matrix in cpp?
Sai
1

Wenn Sie die Python-Wrapper verwenden, dann (vorausgesetzt, Ihr Matrixname ist mat ):

  • mat.shape gibt Ihnen ein Array vom Typ [Höhe, Breite, Kanäle]

  • mat.size gibt Ihnen die Größe des Arrays an

Beispielcode:

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