如何在矩形子区域中划分 OpenCV Mat?
Posted
技术标签:
【中文标题】如何在矩形子区域中划分 OpenCV Mat?【英文标题】:How to divide an OpenCV Mat in rectangular sub-regions? 【发布时间】:2015-09-30 15:46:34 【问题描述】:我想将一个简单的Mat
(200x200) 划分为不同的区域(10x10)。
我创建了 2 个循环,然后创建了一个 Rect
,我在其中指出了我在每次迭代中想要的变量 (x, y, width, height)
。最后,我将图像的这个区域保存在Mat
s 的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 因为你要转换为整数,所以结果是一样的,但你是绝对正确的。
【参考方案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));
【讨论】:
以上是关于如何在矩形子区域中划分 OpenCV Mat?的主要内容,如果未能解决你的问题,请参考以下文章
opencv中检测出人脸之后,需要把检测出的人脸区域提取出来,用作人脸识别,那么如何提取人脸区域