此字段包含一些阈值操作产生的轮廓,这些轮廓具有高度不规则的锯齿状边缘:
此处已满:
目前,我想出的最好的方法是通过点密度来区分这些轮廓与较平滑的轮廓。在下面的示例中,如果有许多点定义了一个相对较小的区域,则将消除形状:
using OpenCvSharp;
//...
const double POINTS_PER_AREA = 2.0;
var cleanedContours = new List<List<Point>>();
var area = Cv2.ContourArea(shape);
foreach (var shape in contours)
{
if (area / shape.Count > POINTS_PER_AREA)
cleanedContours.Add(shape.ToList());
}
尽管我对这种方法不是很满意,因为它经常返回假阳性并依赖于主观常数。有更好的方法吗?