我的目标是在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
...对其进行修改,以便在其中获得
1
的“圆形” ,例如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
,而没有任何效果。 最佳答案
这是因为您要用大垫子中的圆圈坐标填充您的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);
}