这个问题在这里已有答案:
cv :: Mat :: Mat(大小,int类型)
参数size 2D数组大小:大小(cols,rows)。在Size()构造函数中,行数和列数的顺序相反。
我正在阅读4000x3000图像(通过gimp验证),gdb报告4000x3000帧。但是当我创建一个cv::Mat{ cv::Size{ 4000, 3000 } };
时,结果是f.rows == 4000; f.cols == 3000;
。
那么设计界面有什么好处?
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的创建者,但是我可以告诉你其他几个库做同样的事情(看一个图像作为矩阵并使用矩阵表示法)。
我希望这能解决你的疑虑,但如果不是,只要发表评论
我想这更像是一个问题,为什么cols在cv::Size
构造函数的行之前,而cv::Mat
构造函数需要行,然后是cols?
所以这是其中一个问题,(y,x)或(x,y)。从记忆点开始计算就像x+y*width
一样,所以x应该是第一个。
另一方面,数学家习惯使用(y,x)几个世纪的qazxsw poi。