我想使用OpenCV来检测二值图像中不完美的椭圆轮廓,但不幸的是,椭圆轮廓由彼此之间具有更大间隙(最多25个像素)的独立大点组成。
我尝试过OpenCV轮廓检测,但它不起作用。它只标记了单个点的位置,而不是为轮廓生成一个包围圈。
如何使用OpenCV检测轮廓?请帮助。Here's a sample image
我的最终目标是用椭圆拟合虚线环。附近的其他点是噪声数据点。我尝试获得每个点或点簇的轮廓中心,并将这些中心的xy坐标放入数组中。我希望FitEllipse将只捕获形成该环的轮廓中心。但当我执行FitEllipse时,我得到了一个异常“Emgu.CV.Util.CvException:'OpenCV:n〉= 0 &&(深度== CV_32F||深度== CV_32S)'“
private void btnGO_Click(object sender, EventArgs e)
{
Mat pic = new Mat();
pic = CvInvoke.Imread("test image.png",
Emgu.CV.CvEnum.ImreadModes.Grayscale);
VectorOfVectorOfPoint contours= new VectorOfVectorOfPoint();
Mat hierarchy = new Mat();
CvInvoke.FindContours(pic, contours, hierarchy,
Emgu.CV.CvEnum.RetrType.Tree,
Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
Moments moments = new Moments();
List<Point> contourCentersList = new List<Point>();
for (int i = 0; i < contours.Size; i++)
{
int x;
int y;
moments = CvInvoke.Moments(contours[i]);
if (moments.M00 == 0)
continue;
x = Convert.ToInt32(moments.M10 / moments.M00);
y = Convert.ToInt32(moments.M01 / moments.M00);
ContourCentersList.Add(new Point(x, y));
}
Mat contourCenters = new Mat();
contourCenters.SetTo(contourCentersList.ToArray());
RotatedRect ellipse = new RotatedRect();
ellipse = CvInvoke.FitEllipse(contourCenters);
}
1条答案
按热度按时间zf9nrax11#
为了获得一个轮廓,你可以预处理图像,以获得未连接的区域连接。
为此,您可以应用模糊,然后阈值图像。
在图像以及应用模糊和阈值的结果下面:
第一节第一节第一节第一节第一次