如何在 OpenCV / C++ 中为 Mat 对象创建圆形掩码?
How to create circular mask for Mat object in OpenCV / C++?
我的目标是在 Mat
对象上创建一个圆形遮罩,例如Mat
看起来像这样:
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
...修改它,以便我在其中获得 "circular shape" 个 1
s,所以.e.g.
0 0 0 0 0
0 0 1 0 0
0 1 1 1 0
0 0 1 0 0
0 0 0 0 0
我目前正在使用以下代码:
typedef struct {
double radius;
Point center;
} Circle;
...
for (Circle c : circles) {
// get the circle's bounding rect
Rect boundingRect(c.center.x-c.radius, c.center.y-c.radius, c.radius*2,c.radius*2);
// obtain the image ROI:
Mat circleROI(stainMask_, boundingRect);
int radius = floor(radius);
circle(circleROI, c.center, radius, Scalar::all(1), 0);
}
问题是在我调用circle
之后,最多只有一个字段在circleROI
设置为1
...根据我的理解,此代码应该有效,因为 circle
应该使用有关 center
和 radius
的信息来修改 circleROI
,以便所有点在圆圈区域内应设置为 1
... 有没有人向我解释我做错了什么?我是否采取了正确的方法来解决问题,但实际问题可能出在其他地方(这也很有可能,因为我是 C++ 和 OpenCv 的新手)?
请注意,我还尝试将 circle
调用中的最后一个参数(即 圆轮廓的厚度 )修改为 1
和-1
,没有任何影响。
看看:getStructuringElement
这是因为你用大垫子中圆的坐标填充你的 circleROI。您在 circleROI 内的圆圈坐标应相对于 circleROI,在您的情况下为:new_center = (c.radius, c.radius), new_radius = c.radius.
这是循环的代码片段:
for (Circle c : circles) {
// get the circle's bounding rect
Rect boundingRect(c.center.x-c.radius, c.center.y-c.radius, c.radius*2+1,c.radius*2+1);
// obtain the image ROI:
Mat circleROI(stainMask_, boundingRect);
//draw the circle
circle(circleROI, Point(c.radius, c.radius), c.radius, Scalar::all(1), -1);
}
我的目标是在 Mat
对象上创建一个圆形遮罩,例如Mat
看起来像这样:
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
...修改它,以便我在其中获得 "circular shape" 个 1
s,所以.e.g.
0 0 0 0 0
0 0 1 0 0
0 1 1 1 0
0 0 1 0 0
0 0 0 0 0
我目前正在使用以下代码:
typedef struct {
double radius;
Point center;
} Circle;
...
for (Circle c : circles) {
// get the circle's bounding rect
Rect boundingRect(c.center.x-c.radius, c.center.y-c.radius, c.radius*2,c.radius*2);
// obtain the image ROI:
Mat circleROI(stainMask_, boundingRect);
int radius = floor(radius);
circle(circleROI, c.center, radius, Scalar::all(1), 0);
}
问题是在我调用circle
之后,最多只有一个字段在circleROI
设置为1
...根据我的理解,此代码应该有效,因为 circle
应该使用有关 center
和 radius
的信息来修改 circleROI
,以便所有点在圆圈区域内应设置为 1
... 有没有人向我解释我做错了什么?我是否采取了正确的方法来解决问题,但实际问题可能出在其他地方(这也很有可能,因为我是 C++ 和 OpenCv 的新手)?
请注意,我还尝试将 circle
调用中的最后一个参数(即 圆轮廓的厚度 )修改为 1
和-1
,没有任何影响。
看看:getStructuringElement
这是因为你用大垫子中圆的坐标填充你的 circleROI。您在 circleROI 内的圆圈坐标应相对于 circleROI,在您的情况下为:new_center = (c.radius, c.radius), new_radius = c.radius.
这是循环的代码片段:
for (Circle c : circles) {
// get the circle's bounding rect
Rect boundingRect(c.center.x-c.radius, c.center.y-c.radius, c.radius*2+1,c.radius*2+1);
// obtain the image ROI:
Mat circleROI(stainMask_, boundingRect);
//draw the circle
circle(circleROI, Point(c.radius, c.radius), c.radius, Scalar::all(1), -1);
}