一、改进办法
使用FindContours函数识别圆后生产的识别序号与实际排列顺序不同,在处理时进行改进,另外生成一个数组ds0存放实际排列顺序的序列。
CircleSegment0[] cs0 = new CircleSegment0[10];
CircleSegment0[] ds0 = new CircleSegment0[10];
二、识别时转存数组
private void uiButton2_Click(object sender, EventArgs e)
{
{
//1:因为霍夫圆检测对噪声比较敏感,所以首先对图像做一个中值滤波或高斯滤波(噪声如果没有可以不做)
Mat m1 = new Mat();
Cv2.MedianBlur(src_img, m1, 3); // ksize必须大于1且是奇数
//2:转为灰度图像
Mat m2 = new Mat();
Cv2.CvtColor(m1, m2, ColorConversionCodes.BGR2GRAY);
//3:霍夫圆检测:使用霍夫变换查找灰度图像中的圆。
/*
* 参数:
* 1:输入参数: 8位、单通道、灰度输入图像
* 2:实现方法:目前,唯一的实现方法是HoughCirclesMethod.Gradient
* 3: dp :累加器分辨率与图像分辨率的反比。默认=1
* 4:minDist: 检测到的圆的中心之间的最小距离。(最短距离-可以分辨是两个圆的,否则认为是同心圆- src_gray.rows/8)
* 5:param1: 第一个方法特定的参数。[默认值是100] canny边缘检测阈值低
* 6:param2: 第二个方法特定于参数。[默认值是100] 中心点累加器阈值 – 候选圆心
* 7:minRadius: 最小半径
* 8:maxRadius: 最大半径
*
*/
CircleSegment[] cs = Cv2.HoughCircles(m2, HoughMethods.Gradient, 1, 80, 60, 20, 60, 200);
src_img.CopyTo(dst);
// Vec3d vec = new Vec3d();
for (int i = 0; i < cs.Count(); i++)
{
//画圆
Cv2.Circle(dst, (int)cs[i].Center.X, (int)cs[i].Center.Y, (int)cs[i].Radius, new Scalar(0, 0, 255), 5, LineTypes.AntiAlias);
//加强圆心显示
Cv2.Circle(dst, (int)cs[i].Center.X, (int)cs[i].Center.Y, 3, new Scalar(0, 0, 255), 3, LineTypes.AntiAlias);
cs0[i].Center = cs[i].Center;
cs0[i].Radius = cs[i].Radius;
int x0 = (int)cs[i].Center.X;
int y0 = (int)cs[i].Center.Y;
//显示圆心坐标
Cv2.PutText(dst, i.ToString()+"(" + x0.ToString() + "," + y0.ToString() + ")", new OpenCvSharp.Point(x0-100, y0 + 200), 0, 1.25, new OpenCvSharp.Scalar(0, 0, 255), 2);
// 根据X的坐标值,计算实际排列顺序
int j = (x0 - 190) / 300;
ds0[j] = cs0[i];
}
picBoxShowDel.Image = dst.ToBitmap();
}
}
三、展示分割的6个图形
private void uiButton4_Click(object sender, EventArgs e)
{
for (int i = 0; i < 6; i++)
{
int k0 = i;
int x0 = (int)ds0[k0].Center.X;
int y0 = (int)ds0[k0].Center.Y;
int r0 = (int)ds0[k0].Radius;
OpenCvSharp.Rect roi = new OpenCvSharp.Rect(x0 - r0 - 50, y0 - r0 - 50, 2 * (r0 + 50), 2 * (r0 + 50));
Mat ImageROI = new Mat(src_img, roi);//新建一个mat,把roi内的图像加载到里面去
switch (i)
{
case 0:
pictureBox2.Image = ImageROI.ToBitmap();
break;
case 1:
pictureBox3.Image = ImageROI.ToBitmap();
break;
case 2:
pictureBox4.Image = ImageROI.ToBitmap();
break;
case 3:
pictureBox5.Image = ImageROI.ToBitmap();
break;
case 4:
pictureBox6.Image = ImageROI.ToBitmap();
break;
case 5:
pictureBox7.Image = ImageROI.ToBitmap();
break;
}
}
}
网友评论