为什么cv :: Mat ctor期望交换大小?

时间:2019-02-24 09:14:25

标签: c++ opencv

  

cv :: Mat :: Mat(大小大小,整数类型)

     

参数       大小2D数组大小:Size(cols,rows)。在Size()构造函数中,行数和列数的顺序相反。

docs

我正在读取4000x3000图像(通过gimp验证),gdb报告了4000x3000帧。但是,当我创建一个cv::Mat{ cv::Size{ 4000, 3000 } };时,结果是f.rows == 4000; f.cols == 3000;

如此设计界面的优势是什么?

3 个答案:

答案 0 :(得分:1)

我想这是一个更多的问题,为什么cv::Size构造函数的cols在行之前,而cv::Mat构造函数的期望行是cols?

这是(y,x)或(x,y)这些问题之一。 从存储点开始,计算的工作方式类似于x+y*width,因此x应该位于第一个。

另一方面,

数学家过去几个世纪以来一直使用(y,x)wiki reference

答案 1 :(得分:0)

Hm, cv :: Mat {cv :: Size {4000,3000}};有效?我怀疑。

尝试这种方式:

cv::Mat img1(cv::Size(4000, 3000), CV_8UC3);
cv::Mat img2(3000, 4000, CV_8UC3);

它们确实有效。

答案 2 :(得分:0)

cv::Mat以矩阵的形式查看,并且按照对矩阵的顺序进行访问/创建,例如:

int rows = 4000, cols = 3000, type = CV_8U;
cv::Mat something( rows, cols, type, cv::Scalar::all(0));
something.at<uchar>(178 /*row*/, 928/*col*/) = 124;

在OpenCV中,不仅有cv :: Mat,例如cv :: Point,它使用笛卡尔坐标,即x,y。用矩阵表示法来说,这些点是(行,行)。猜猜是什么,它也可以与.at一起使用来指定一个点,像这样:

something.at<uchar>(cv::Point(928/*col*/,178/*row*/)) = 124;

我们还有cv::Rect,它由左上角和右下角或左上角,宽度和高度构成。在代码中,它类似于:

cv::Rect r(10, 12, 100, 120);
// or in other words
cv::Rect r2(cv::Point(10,12), cv::Size(100, 120));

cv::Size表示法(宽度,高度)与其他几个程序/操作系统(例如Windows)一致,您可以在其中看到以宽度x高度指定的大小(在您的示例中为4000 x 3000)。

说了这么多,您可以看到OpenCV在可以使用的表示法中变得非常灵活。有些人会坚持使用cv :: Mat的矩阵符号和Points和Rects的笛卡尔坐标,另一些人则喜欢笛卡尔坐标中的所有内容...为什么要这样做?您最好问一下OpenCV的创建者,但是我可以告诉您其他几个库也做同样的事情(将图像视为矩阵并为其使用矩阵符号)。

我希望这可以消除您的疑问,但如果不能发表评论,