Размер матрицы OpenCV


128

Я знаю, что это может быть очень элементарно, но я новичок в OpenCV. Подскажите, пожалуйста, как получить размер матрицы в OpenCV ?. Я погуглил и все еще ищу, но если кто-то из вас знает ответ, пожалуйста, помогите мне.

Размер как количество строк и столбцов.

И есть ли способ напрямую получить максимальное значение 2D-матрицы?

Ответы:


240
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
Расим

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);

Это единственный ответ, который также касается поиска самого большого элемента в OpenCV Mat.
rayryeng

12

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

mat.rows - Количество строк в 2D-массиве.

mat.cols - Количество столбцов в 2D-массиве.

Или: C ++: Size Mat :: size () const

Метод возвращает размер матрицы: Размер (столбцы, строки). Когда матрица более двухмерна, возвращаемый размер равен (-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 для оси y, 4 для оси x. Под x, y, z это означает порядок размеров. x индекс изменяется быстрее всего.


1
просто для ясности: не существует Mat::size()метода-члена, а скорее Mat::sizeтип переменной-члена MatSize. Последний перегружает оператор круглых скобок, MatSize::operator()чтобы вернуть Sizeобъект
Амро

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 ):

  • 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.