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 表示法(宽度,高度)与其他几个程序/操作系统(如窗口)一致,您可以在其中看到指定为宽度 x 高度的大小(在您的示例中为 4000 x 3000)。
说了这么多,您可以看到 OpenCV 在可以使用的符号方面非常灵活。有些人会坚持使用 cv::Mat 的矩阵表示法和 Points 和 Rects 的笛卡尔坐标,而另一些人则更喜欢笛卡尔坐标系中的一切......为什么这个决定?你最好问问 OpenCV 的创建者,但我可以告诉你其他几个库也是这样做的(将图像视为矩阵并使用矩阵表示法)。
我希望这可以消除您的疑虑,但如果不是,请发表评论