为什么cv :: Mat ctor期望交换大小? [重复]

问题描述 投票:0回答:3

这个问题在这里已有答案:

cv :: Mat :: Mat(大小,int类型)

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

docs

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

那么设计界面有什么好处?

c++ opencv
3个回答
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。在矩阵表示法中,点是(col,row)。猜猜看,它也可以和.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表示法(宽度,高度)与其他几个程序/ os(如windows)一致,您可以在其中看到指定为width x height的大小(在您的示例中为4000 x 3000)。

说了这么多,你可以看到OpenCV在可以使用的符号上非常灵活。有些人会坚持使用cv :: Mat的矩阵符号和Point和Rects的笛卡尔坐标,其他一些人更喜欢笛卡儿的一切...为什么这个决定?你最好问一下OpenCV的创建者,但是我可以告诉你其他几个库做同样的事情(看一个图像作为矩阵并使用矩阵表示法)。

我希望这能解决你的疑虑,但如果不是,只要发表评论


1
投票

我想这更像是一个问题,为什么cols在cv::Size构造函数的行之前,而cv::Mat构造函数需要行,然后是cols?

所以这是其中一个问题,(y,x)或(x,y)。从记忆点开始计算就像x+y*width一样,所以x应该是第一个。

另一方面,数学家习惯使用(y,x)几个世纪的qazxsw poi。


0
投票

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

试试这个方法:

wiki reference

他们真的很有效。

© www.soinside.com 2019 - 2024. All rights reserved.