我的目标是在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
应该使用有关center
和radius
的信息来修改circleROI
,以便所有点都在圆圈应该设置为1
...有没有人对我有什么解释我做错了什么?我是否采取了正确的方法解决问题,但实际问题可能在其他地方(这也是非常可能的,因为我是C ++和OpenCv的新手)?
请注意,我还尝试将circle
调用中的最后一个参数(即圆形轮廓的粗细)修改为1
和-1
,没有任何影响。
答案 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)
看看:getStructuringElement