OpenCV中矩阵的大小

157

我知道这可能很基础,但我是OpenCV的新手。你能告诉我如何获取OpenCV中矩阵的大小吗?我已经在谷歌上搜索了一下,但还在继续寻找,如果你们中任何人知道答案,请帮助我。

所谓大小指的是行数和列数。

还有没有一种直接获得2D矩阵最大值的方法?

5个回答

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

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

11
这是一个链接到OpenCV文档中有关Mat类尺寸的部分。Mat类是OpenCV中最常用的数据结构之一,用于表示图像和矩阵等多维数组。在这个文档中,你可以找到有关如何访问和修改Mat对象的大小(尺寸)信息的详细说明。 - Rasim
2
这两者是完全等价的吗? - alx - recommends codidact
这些之间有什么区别?这个备注看起来很困惑,提到了某种步长。 - hans
1
是的,有人编辑了答案并添加了有关步幅的奇怪信息。我已经回滚了那个修改。 - Michael O
为什么文档将 size 列为公共属性而不像您所拥有的那样作为函数?https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a146f8e8dda07d1365a575ab83d9828d1 - simplename

21

请注意,除了行和列之外,还有通道和类型。当了解类型后,通道可以作为额外的维度,如 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

16

对于2D矩阵:

mat.rows - 2D数组中的行数。

mat.cols - 2D数组中的列数。

或者: C++:Size Mat::size() const

该方法返回矩阵大小:Size(cols, rows)。当矩阵的维度大于2时,返回的大小为(-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索引变化最快。


2
请注意,Mat::size() 并不是成员方法,而是类型为 MatSizeMat::size 成员变量。后者重载了圆括号运算符 MatSize::operator(),以返回一个 Size 对象。 - Amro
截至今天,我使用了OpenCV 4.7的Mat::size()函数。因此,我相信这个函数是在2019年之后添加的。 - ollydbg23

5
如果您使用的是 Python 封装器(假设您的矩阵名称为 mat),则:
  • mat.shape 给出一个形如 [高度,宽度,通道数] 的数组

  • mat.size 给出数组的大小

示例代码:

import cv2
mat = cv2.imread('sample.png')
height, width, channel = mat.shape[:3]
size = mat.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
在C++中,我们如何获取矩阵的深度? - sai
.channels() 命令将为您提供深度。 - Saurav Solanki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接