【OpenCv/EmguCv】指针式仪表读数(一)
1. 预处理
1.1 双边滤波
img.SmoothBilatral(int val1,int val2,int,val3)
(原图)
(双边滤波)
(高斯滤波)
高斯滤波将整张图都变得模糊了,双边滤波则保留了清晰轮廓特征,效果比较好。
1.2 灰度并二值
img.Convert<Gray, byte>()//灰度化g
(灰度图)
ThresholdBinary(new Gray(Parameters.BinVal),new Gray(255));//二值化
(二值图)
2. 指针提取
1.1 帧差法提取指针
用当前帧减去上一帧得到运动的指针图像。
private Image<Gray,byte> SubBackground(Image<Gray,byte>pic){Image<Gray, byte> gray = new Image<Gray, byte>(pic.Size);if (tag == 0){Subbg[0] = pic;//背景帧(上一帧)tag = 1;return Subbg[0];}else{Subbg[1] = pic;gray = Subbg[1] - Subbg[0];//当前帧减去背景帧(上一帧)Subbg[0] = Subbg[1];}return gray;}
(指针)
2.2 霍夫圆检测
对灰度图进行霍夫圆检测。
private Image<Bgr, byte> CirclePic(Image<Gray, byte> pic){Image<Bgr, byte> outpic = new Image<Bgr, byte>(pic.Size);//霍夫圆检测CircleF[] circle = CvInvoke.HoughCircles(pic, Emgu.CV.CvEnum.HoughType.Gradient, 10, 1000);foreach (CircleF c in circle){CvInvoke.Circle(outpic, new Point((int)c.Center.X, (int)c.Center.Y), (int)c.Radius, new MCvScalar(255, 255, 0), 5);center.X = (int)c.Center.X;center.Y = (int)c.Center.Y;radius = c.Radius;outpic.Draw(new CircleF(new PointF(center.X, center.Y), 5), new Bgr(255, 0, 255), 10);outpic.Draw(new LineSegment2D(new Point(0, center.Y), new Point(pic.Width, center.Y)), new Bgr(Color.Blue), 2);outpic.Draw(new LineSegment2D(new Point(center.X, 0), new Point(center.X, pic.Height)), new Bgr(Color.Blue), 2);outpic.Draw(new Point(center.X, center.Y).ToString(), new Point(center.X,center.Y), Emgu.CV.CvEnum.FontFace.HersheyComplexSmall, 1, new Bgr(255, 0, 255));}return outpic;}
2.3 直线检测
对帧差法提取到的指针图像进行直线检测。
检测到的结果包含多条直线,首先对长度不符合的进行过滤(这里排除长度小于70的线段),过滤后仍然包含多条线段,但是我们只需要一条,所以进行直线合并,只保留一条。
//返回直线端点的坐标public Point AvrPoint(Point[] point){Point outpoint = new Point(0, 0);int p_x = 0;int p_y = 0;int n = 0;foreach (Point p in point){if (p.X != 0 && p.Y != 0){p_x += p.X;p_y += p.Y;n++;}}if (n != 0){p_x = p_x / n;p_y = p_y / n;}outpoint = new Point(p_x, p_y);return outpoint;}
2.4 绘制指针
以圆心为指针的
一端,2.3中求得的线段端点为另一端绘制直线。并在同一张图片上绘制出圆心和圆(刻度盘)
【OpenCv/EmguCv】指针式仪表读数(一)相关推荐
- 毕业设计(四)-- 指针式仪表读数
1 图像预处理 1.1 中值滤波 为了使输入图像更加清晰,需要对其进行去噪.在常用的去噪算法中,中值滤波可以很好的保留边缘信息同时去除噪点,中值滤波的原理是对矩阵中的像素值进行排序,并用序列中 ...
- 巡检机器人中的指针式仪表读数识别系统
巡检机器人中的指针式仪表读数识别[MATLAB,GUI,语音] 摘要:巡检机器人能自动识别仪表设备的状态,先准确定位图像中的仪表设备,在此基础上,实现了仪表读数的自动识别. 摘要:巡检机器人能自动识别 ...
- 毕业设计-基于深度学习的指针式仪表读数识别系统
目录 前言 课题背景和意义 实现技术思路 一.指针式仪表读数识别算法的设计 二.指针和刻度线提取及仪表示数识别 实现效果图样例 最后 前言
- C# OpenCV EmguCV LSD直线检测使用Demo
点击下方卡片,关注"OpenCV与AI深度学习"公众号! 视觉/图像重磅干货,第一时间送达! LSD直线检测原理大家可以自行百度查询,这里给出EmguCV4.5.4使用Demo如下 ...
- vb.net opencv emgucv 图像识别基本功能合集
更新(2021.10)统一回复:有一段时间没上csdn,发现最近还有挺多同志私信要该软件及源码,非常不好意思哈,以前可以大家发免费共享,但现在涉及到版权,整个软件和代码没法共享了!不过可以给你定制二次 ...
- C# OpenCV EmguCV实现扫描文本图像倾斜矫正 实现详解(附源码)
一.扫描文本倾斜矫正 实现步骤可以参考如下链接: https://blog.csdn.net/stq054188/article/details/120031667?spm=1001.2014.300 ...
- 完整opencv(emgucv)人脸、检测、采集、识别、匹配、对比
//成对几何直方图匹配 public static string MatchHist() { string haarXml ...
- Opencv EmguCv 基本识别步骤
{ //1.灰度化,竖向边缘检测 //2.自适应二值化处理 //3.形态学处理(膨胀和腐蚀) //4.轮廓查找与筛选 Image<Bgr, byte> simage = OriImage; ...
- 毕业设计-基于机器视觉的指针式仪表读数自动识别研究与实现
目录 前言 课题背景和意义 实现技术思路 一.表盘区域定位算法 二.Mask R-CNN 网络模型分析 三.表盘区域定位算法改进与实现 实现效果图样例 最后 前言
最新文章
- react使用moment进行日期格式化
- 数字化转型升级,人才战略是核心
- centos7启动dhcp失败_4:Nginx服务启动、停止、重启
- c语言循环拆分成和,C语言拆分循环链表程序
- 服务器计时器、Windows 计时器和线程计时器
- linux把虚拟机上的文件共享,[转]windows中vmware虚拟机中的Linux如何进行文件的共享...
- python模式字符串_使用python进行字符串模式匹配
- java 多线程编程指南 pdf_Java-多线程编程
- 为Android系统定制重启功能
- MVC3+EF4.1学习系列(五)----- EF查找导航属性的几种方式
- cocoscreator3.x 用tiledMap趟坑
- Hbuilder中如何快速输入注释标签_三菱PLC编程软件如何使用注释、声明、注解?...
- 给加西亚的信》--如何做一名优秀员工
- (两百五十六)学习perfetto(一)
- Redhat8.4系统安装
- web前端开发工程师是做什么工作的?
- ubuntu网络无法连接
- Java实现简单的猜数字小游戏
- 前端table导出excel表格方法汇总
- 23种设计模式(GOF)