C#编程实现自定义控件与OpenCVsharp的图像处理技术,快速精确地找出圆的位置
C# 自定义控件 opencvsharp 找圆最近在做个工业视觉检测项目时发现WinForm自带的PictureBox控件完全不够用。客户要求实时显示摄像头画面还要标出圆形瑕疵这逼得我不得不撸起袖子造轮子——用C#自定义控件整合OpenCvSharp实现找圆功能。先搞个基础画布控件继承UserControl后往里塞个双缓冲的PictureBoxpublic class VisionCanvas : UserControl { private PictureBox picBox new PictureBox(); private float zoomScale 1.0f; public VisionCanvas() { picBox.SizeMode PictureBoxSizeMode.Zoom; picBox.Dock DockStyle.Fill; this.Controls.Add(picBox); this.Resize (s, e) { if (picBox.Image ! null) { // 保持图像比例缩放 zoomScale Math.Min( (float)this.Width / picBox.Image.Width, (float)this.Height / picBox.Image.Height); } }; } }这里有个坑要注意直接修改PictureBox的尺寸会导致图像变形所以我在Resize事件里动态计算缩放比例。zoomScale这个参数后面画标记时会派上大用场。C# 自定义控件 opencvsharp 找圆重点来了OpenCvSharp的找圆方法比传统Hough变换更高效。在控件类里加个FindCircles方法public CircleSegment[] FindCircles(Mat src, int minRadius10, int maxRadius100) { using (var gray new Mat()) { Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY); Cv2.MedianBlur(gray, gray, 5); return Cv2.HoughCircles(gray, HoughMethods.Gradient, dp: 1.2, minDist: gray.Height / 8, param1: 100, param2: 30, minRadius: minRadius, maxRadius: maxRadius); } }参数解释时间dp1.2图像分辨率缩小比例实测1.2能平衡精度和速度minDist防止圆圈检测重叠按图像高度动态调整更智能param2这个值越小检测越敏感但误检率会上升检测到圆之后得在控件上画出来。重写控件的OnPaint方法protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (_circles ! null) { using (var g e.Graphics) { foreach (var circle in _circles) { // 坐标转换原始图像坐标→缩放后控件坐标 var center new Point( (int)(circle.Center.X * zoomScale), (int)(circle.Center.Y * zoomScale)); var radius (int)(circle.Radius * zoomScale); // 画圆 g.DrawEllipse(Pens.Red, center.X - radius, center.Y - radius, radius * 2, radius * 2); // 画圆心十字线 g.DrawLine(Pens.Blue, center.X-10, center.Y, center.X10, center.Y); g.DrawLine(Pens.Blue, center.X, center.Y-10, center.X, center.Y10); } } } }这里有个细节直接拿原始图像的坐标画会错位必须乘以之前算好的zoomScale系数。画十字线时用固定10像素长度这样无论怎么缩放标记都清晰可见。实际使用时只需要三行代码var canvas new VisionCanvas { Dock DockStyle.Fill }; var image Cv2.ImRead(test.jpg); canvas.SetImage(image.ToBitmap()); canvas.FindCircles(image);调试时发现个有趣现象——当图像中有多个同心圆时适当调高param2参数能过滤掉内层小圆。这比写复杂的逻辑判断省事多了果然参数调优才是OpenCV的正确打开方式。完整项目里还可以给控件添加右键菜单保存当前参数配置到本地。毕竟产线上的工人大哥可没耐心每次都手动调参咱们得把复杂度封装在底层。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2420906.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!