如何在OpenCV / C ++中为Mat对象创建圆形蒙版?

时间:2015-03-09 08:12:03

标签: c++ opencv mat

我的目标是在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

...对其进行修改,以便在其中获得{{>>#34; 的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应该使用有关centerradius的信息来修改circleROI,以便所有点都在圆圈应该设置为1 ...有没有人对我有什么解释我做错了什么?我是否采取了正确的方法解决问题,但实际问题可能在其他地方(这也是非常可能的,因为我是C ++和OpenCv的新手)?

请注意,我还尝试将circle调用中的最后一个参数(即圆形轮廓的粗细)修改为1-1 ,没有任何影响。

2 个答案:

答案 0 :(得分:4)

这是因为你正在用大垫子中的圆圈坐标填充你的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);

}

答案 1 :(得分:1)