cv :: Mat :: Mat(大小大小,整数类型)
参数 大小2D数组大小:Size(cols,rows)。在Size()构造函数中,行数和列数的顺序相反。
我正在读取4000x3000图像(通过gimp验证),gdb报告了4000x3000帧。但是,当我创建一个cv::Mat{ cv::Size{ 4000, 3000 } };
时,结果是f.rows == 4000; f.cols == 3000;
。
如此设计界面的优势是什么?
答案 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的创建者,但是我可以告诉您其他几个库也做同样的事情(将图像视为矩阵并为其使用矩阵符号)。
我希望这可以消除您的疑问,但如果不能发表评论,