【问题标题】:Why does cv::Mat ctor expect swapped size? [duplicate]为什么 cv::Mat ctor 期望交换大小? [复制]
【发布时间】:2019-07-17 22:12:55
【问题描述】:

cv::Mat::Mat (Size size, int type)

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

docs

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

这样设计界面有什么好处?

【问题讨论】:

标签: c++ opencv


【解决方案1】:

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

所以这是其中一个问题,(y, x) 或 (x, y)。 从记忆点来看,计算的工作方式类似于 x+y*width,所以 x 应该是第一个。

另一方面,数学家过去几个世纪以来一直使用 (y, x) wiki reference。

【讨论】:

    【解决方案2】:

    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 的创建者,但我可以告诉你其他几个库也是这样做的(将图像视为矩阵并使用矩阵表示法)。

    我希望这可以消除您的疑虑,但如果不是,请发表评论

    【讨论】:

      【解决方案3】:

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

      试试这个方法:

      cv::Mat img1(cv::Size(4000, 3000), CV_8UC3);
      cv::Mat img2(3000, 4000, CV_8UC3);
      

      它们真的很有效。

      【讨论】:

        猜你喜欢
        • 2023-04-05
        • 2017-09-29
        • 2020-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-29
        • 1970-01-01
        相关资源
        最近更新 更多