【问题标题】:How to divide an OpenCV Mat in rectangular sub-regions?如何在矩形子区域中划分 OpenCV Mat?
【发布时间】:2015-09-30 15:46:34
【问题描述】:

我想将一个简单的Mat (200x200) 划分为不同的区域(10x10)。 我创建了 2 个循环,然后创建了一个 Rect,我在其中指出了我在每次迭代中想要的变量 (x, y, width, height)。最后,我将图像的这个区域保存在Mats 的vector 中。

但是我的代码有问题:

Mat face = Mat(200, 200, CV_8UC1);
vector<Mat> regions;
Mat region_frame;
int width = face.cols * 0.05;
int heigth = face.rows * 0.05;
for(int y=0; y<=(face.rows - heigth); y+=heigth)
{
    for(int x=0; x<=(face.cols - width); x+=width)
    {
        Rect region = Rect(x, y, x+width, y+heigth);
        region_frame = face(region);
        regions.push_back(region_frame);            
    }
}

问题只是在最后一步,它不适用于我尝试创建的新region_frame 的大小。它随着每列的迭代次数而增加。

我该如何解决这个问题?

【问题讨论】:

  • 你只需要更正:Rect region = Rect(x, y, width, heigth);
  • 嘘!!!可怕的错误!我想这很明显......非常感谢您的帮助!
  • 很高兴它有帮助。我刚刚发布了一个详细的答案。
  • 与您的问题并不真正相关,但是:由于宽度和高度是整数,而 face.cols 和 face.rows 是整数,将宽度计算为 face.cols / 20 会不会更好,就这样它都在同一个域(整数)中,而不是用浮点数(或双精度数)做数学?
  • @Octopus 因为你要转换为整数,所以结果是一样的,但你是绝对正确的。

标签: c++ opencv mat rect


【解决方案1】:

OpenCV Rect 可以构造为:

Rect(int _x, int _y, int _width, int _height);

因此您需要将代码中的行更改为:

Rect region = Rect(x, y, width, heigth);

您似乎改为传递左上角和右下角的坐标。如果您想这样做,请使用其他构造函数:

Rect(const Point& pt1, const Point& pt2);

你可以这样做:

Rect region = Rect(Point(x, y), Point(x+width, y+heigth));

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2014-07-30
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2023-03-15
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多