Розмір матриці OpenCV


128

Я знаю, що це може бути дуже рудиментарним, але я новачок у OpenCV. Скажіть, будь ласка, як отримати розмір матриці в OpenCV ?. Я гугл і все ще шукаю, але якщо хтось із вас знає відповідь, будь ласка, допоможіть мені.

Розмір як у кількості рядків і стовпців.

І чи є спосіб безпосередньо отримати максимальне значення 2D-матриці?

Відповіді:


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

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

Також зауважте, що stride> = cols; це означає, що фактичний розмір рядка може бути більшим за розмір елемента x cols. Це відрізняється від питання безперервного мат і пов'язане з вирівнюванням даних.


10
Посилання на документацію: docs.opencv.org/modules/core/doc/basic_structures.html#mat-size
Rasim

1
Це два точні еквіваленти?
Cacahuete Frito

19

Зауважте, що крім рядків та стовпців є ряд каналів та типів. Коли зрозуміло, що таке тип, канали можуть діяти як додатковий вимір, як у CV_8UC3, тож ви б зверталися до матриці як

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

Тож розмір у елементах елементарного типу становить M.rows * M.cols * M.cn

Щоб знайти максимальний елемент, можна скористатися

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

Це єдина відповідь, яка також стосується пошуку найбільшого елемента в MatC OpenCV.
rayryeng

12

Для 2D матриці:

mat.rows - Кількість рядків у двовимірному масиві.

mat.cols - Кількість стовпців у двовимірному масиві.

Або: C ++: Mat Mat :: size () const

Метод повертає розмір матриці: Розмір (cols, рядки). Коли матриця більше двовимірної, повертається розмір (-1, -1).

Для багатовимірної матриці потрібно використовувати

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;

Зауважте, тут 2 для осі z, 3 для осі у, 4 для осі х. Під x, y, z це означає порядок розмірів. x індекс змінюється найшвидше.


1
просто, щоб було зрозуміло, немає жодного Mat::size()методу-члена, скоріше Mat::sizeзмінної типу MatSize. Останній перевантажує оператор в дужках MatSize::operator()повернути Sizeоб’єкт
Amro

4

Повноцінний приклад C ++ може бути корисним для початківців

#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
як ми отримуємо глибину матриці в cpp?
Сай

1

Якщо ви використовуєте обгортки Python, то (припустимо, що ваше матричне ім'я є мат ):

  • mat.shape дає масив типу- [висота, ширина, канали]

  • mat.size надає розмір масиву

Приклад коду:

import cv2
mat = cv2.imread('sample.png')
height, width, channel = mat.shape[:3]
size = mat.size
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.