Rozmiar Matrix OpenCV

130

Wiem, że to może być bardzo elementarne, ale jestem nowy w OpenCV. Czy mógłbyś mi powiedzieć, jak uzyskać rozmiar matrycy w OpenCV ?. Poszukałem w Google i nadal szukam, ale jeśli ktoś z was zna odpowiedź, proszę o pomoc.

Rozmiar zgodny z liczbą wierszy i kolumn.

A czy jest sposób na bezpośrednie uzyskanie maksymalnej wartości macierzy 2D?

Lakshmi Narayanan
źródło

Odpowiedzi:

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

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

Zwróć też uwagę, że stride> = cols; oznacza to, że rzeczywisty rozmiar wiersza może być większy niż rozmiar elementu x cols. Różni się to od problemu ciągłej Mat i jest związane z wyrównaniem danych.

Michael O
źródło
1
Czy te dwa dokładne odpowiedniki?
Cacahuete Frito
19

Zwróć uwagę, że oprócz wierszy i kolumn istnieje wiele kanałów i typów. Kiedy jest jasne, jaki jest typ, kanały mogą działać jako dodatkowy wymiar, jak w CV_8UC3, więc możesz zaadresować macierz jako

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

Czyli rozmiar pod względem elementów typu elementarnego to M.rows * M.cols * M.cn

Aby znaleźć maksymalny element, którego można użyć

Mat src;
double minVal, maxVal;
minMaxLoc(src, &minVal, &maxVal);
Vlad
źródło
To jedyna odpowiedź, która dotyczy również znalezienia największego elementu w macie OpenCV.
rayryeng
12

Dla macierzy 2D:

mat.rows - liczba wierszy w tablicy 2D.

mat.cols - Liczba kolumn w tablicy 2D.

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

Metoda zwraca rozmiar macierzy: Size (kolumny, wiersze). Gdy macierz jest więcej niż 2-wymiarowa, zwracany rozmiar to (-1, -1).

W przypadku macierzy wielowymiarowej musisz użyć

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;

Uwaga, tutaj 2 dla osi z, 3 dla osi y, 4 dla osi x. Przez x, y, z oznacza kolejność wymiarów. Indeks x zmienia się najszybciej.

user1914692
źródło
1
żeby było jasne, nie ma Mat::size()metody składowej, a raczej Mat::sizezmienna składowa typu MatSize. Ta ostatnia przeciąża operator nawiasów, MatSize::operator()aby zwrócić Sizeobiekt
Amro
4

Kompletny przykład kodu w C ++ może być pomocny dla początkujących

#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
źródło
1
jak uzyskać głębokość macierzy w cpp?
sai
1

Jeśli używasz opakowań Pythona, to (zakładając, że nazwa twojej macierzy to mat ):

  • mat.shape daje tablicę typu- [wysokość, szerokość, kanały]

  • mat.size podaje rozmiar tablicy

Przykładowy kod:

import cv2
mat = cv2.imread('sample.png')
height, width, channel = mat.shape[:3]
size = mat.size
nimesh00
źródło