OpenCV C++ Mat 类行和列 - 它们是成员变量(和相关问题)吗?

Posted

技术标签:

【中文标题】OpenCV C++ Mat 类行和列 - 它们是成员变量(和相关问题)吗?【英文标题】:OpenCV C++ Mat class rows and cols - are they member variables (and related questions)? 【发布时间】:2017-08-25 14:44:32 【问题描述】:

我对如何在 OpenCV 的 Mat 类中实现行和列感到有些困惑,希望有人可以提供一些说明。

使用 Mat 类时,rows 和 cols 后面不能有 (),即:

cv::Mat imgSomeImage;
imgSomeImage = cv::imread("some_image.png");

// this line works
std::cout << "num rows = " << imgSomeImage.rows << "\n";

// this line does not compile, only difference is the () after rows
std::cout << "num rows = " << imgSomeImage.rows() << "\n";

熟悉 .NET,我起初认为 rows 和 cols 必须是属性,但在阅读后:

Does C++11 have C#-style properties?

似乎 C++ 没有等价物,至少在没有添加类来模仿 .NET 属性的情况下没有,据我所知,OpenCV 没有。

所以,我认为 Mat rows 和 cols 必须是成员变量,并前往 OpenCV 源进行确认。

检查 mat.hpp:

https://github.com/opencv/opencv/blob/master/modules/core/include/opencv2/core/mat.hpp

第 217 和 218 行:

int cols(int i=-1) const;
int rows(int i=-1) const;

是我不清楚的地方。我已经看过很多次了:

// declare a member variable with a default value of -1
int cols = -1;

或者这个:

const int SOME_CONSTANT = 123;

如果 cols 对外界应该是只读的,我会想到这样的:

// member variable
private:
    int _cols;

// getter
public:
    int cols()  return _cols; 

查看matrix.cpp中rows和cols的用法:

https://github.com/opencv/opencv/blob/master/modules/core/src/matrix.cpp

例如,第 395 行:

    if( d == 2 && rows == _sizes[0] && cols == _sizes[1] )

或第 498 行:

    cols = _colRange.size();

还有很多类似的例子,看来这些确实是成员变量,但我还是不清楚217&218行的语法:

int cols(int i=-1) const;
int rows(int i=-1) const;

有人可以澄清这些是否是成员变量以及声明行的语法方面发生了什么?

【问题讨论】:

您正在查看的行不是来自MatMat::row(int)Mat::col(int) 在第 1081 和 1090 行 请比“不编译”更具体。复制并粘贴错误消息。 @tobi303,我认为他们在第 2047 行,请参阅下面的 Miki 的回答。既然你提到了,以第1081行为例,我还是不明白“Mat row(int y) const;”语法,如果有人能解释这是在做什么以及这种语法是如何有效的,那就太好了。 Mat 还有row(int)col(int),它们是成员函数。与您正在查看的类相反,它们没有默认参数,因此在调用它们时您需要传递一个参数,例如some_mat.row(3);,但我也不知道它们在做什么,但必须在某处有文档,即通常更容易理解代码;) 【参考方案1】:

您正在查看_InputArray

如果您查看Mat,您会在2047 行看到rowscols 实际上是成员变量:

int rows, cols;

【讨论】:

感谢您的澄清。这些超过 3,000 行的 .h 文件有时可能有点难以导航。如果有人想知道,对于 mat.hpp github.com/opencv/opencv/blob/master/modules/core/include/… ,类 InputArray 从第 148 行开始,类 _OutputArray 从第 277 行开始,类 _InputOutputArray 从第 359 行开始,类 MatAllocator 从第 435 行开始,MatCommaInitializer 开始在第 480 行,类 Mat 本身最终从第 772 行开始,Mat_ 从第 2135 行开始,UMat 从第 2339 行开始,...... . . (还有更多,但我的回复中没有字符!)

以上是关于OpenCV C++ Mat 类行和列 - 它们是成员变量(和相关问题)吗?的主要内容,如果未能解决你的问题,请参考以下文章

opencv中 Mat矩阵申明形式

如何访问二进制 Mat 图像中的像素值?

如何将 C++ 数组转换为 opencv Mat

读取特定的行和列 C++

opencv 访问图像像素的三种方式

如何删除 C++ 给定矩阵中的特定行和列?