cv :: Mat :: Mat(大小,int类型) 参数 size 2D数组大小:大小(cols,rows)。在Size()构造函数中,行数和列数…
我想这更像是一个问题,为什么cols在行之前 cv::Size 构造函数,而a cv::Mat 构造函数需要行,然后是cols?
cv::Size
cv::Mat
所以这是其中一个问题,(y,x)或(x,y)。 从记忆点来看,计算就像 x+y*width ,所以x应该是第一个。
x+y*width
另一方面,数学家习惯使用(y,x)几个世纪 维基参考 。
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 指定一个点,如下所示:
.at
something.at<uchar>(cv::Point(928/*col*/,178/*row*/)) = 124;
我们还有 cv::Rect ,由左上角和右下角或左上角,宽度和高度构成。在代码中它是这样的:
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(如窗口)一致,您可以在其中看到指定为宽度x高度的大小(在您的示例中为4000 x 3000)。
说了这么多,你可以看到OpenCV在可以使用的符号上非常灵活。有些人会坚持使用cv :: Mat的矩阵符号和Point和Rects的笛卡尔坐标,其他一些人更喜欢笛卡儿的一切...为什么这个决定?你最好问一下OpenCV的创建者,但我可以告诉你其他几个库做同样的事情(将图像看作矩阵并使用矩阵表示法)。
我希望这能解决你的疑虑,但如果不是,只要发表评论
嗯, cv :: Mat {cv :: Size {4000,3000}};作品 ?我怀疑。
试试这个方法:
cv::Mat img1(cv::Size(4000, 3000), CV_8UC3); cv::Mat img2(3000, 4000, CV_8UC3);
他们真的很有效。