精华内容
下载资源
问答
  • 用halcon11写的指针仪表识别代码,在C#和VB都开发了软件
  • 一种指针式仪表的识别方法杨世杰,张平【摘要】当前指针仪表识别技术日益成熟,其中指针形状和位置的识别大多采用Hough变换算法,传统的Hough变换算法运算时间长、储存空间大,使得识别过程效率低下。针对以上缺点...

    一种指针式仪表的识别方法

    杨世杰,张

    【摘

    要】

    当前指针式仪表识别技术日益成熟,其中指针形状和位置的识别大多

    采用

    Hough

    变换算法,传统的

    Hough

    变换算法运算时间长、储存空间大,使

    得识别过程效率低下。针对以上缺点,提出一种改进型

    Hough

    变换。通过限

    定指针式仪表表盘环形区域、运用差影法确定指针的大致区域、指针通过表盘

    圆心这三个限制条件来缩减

    Hough

    变换扫描的范围,以此缩减

    Hough

    变换算

    法的存储空间和计算量。将改进型

    Hough

    变换算法与传统的

    Hough

    变换算法

    相比较,实验结果表明:改进型

    Hough

    变换可有效地减少算法运行时间,提

    高指针仪表识别的实时性。

    【期刊名称】

    微型机与应用

    【年

    (

    ),

    期】

    2017(036)017

    【总页数】

    3

    【关键词】

    指针识别;

    Hough

    变换;图像处理

    0

    引言

    由于指针式仪表具备性能可靠、工作原理简单、价格低廉、抗干扰能力强等优

    点,在日常生活和工业现场具有广泛的应用。目前大多数指针式仪表不具备数

    据接口,仪表显示数据的识别记录要靠人工来完成,由于人为因素,数据容易

    产生误差,此外有些环境恶劣的工业现场不适合人工抄表记录数据,因而研究

    实现指针式仪表显示数据的自动识别在一些工业现场具有重要的实用意义

    [1-2]

    指针的提取以及识别是指针式仪表数据自动识别的关键技术之一。针对指针的

    识别,已有很多成果。主要包括最小二乘法、传统的

    Hough

    直线变换法、减

    展开全文
  • 指针仪表识别(MFC)

    2018-03-15 15:56:04
    图像处理的指针仪表识别,利用OPENCV库,MFC对话框程序
  • OPENCV与VC++指针式仪表识别,识别圆形指针仪表,并读数,内含测试图片,鲁棒性好,识别精度高,正在解决识别非圆形电压表的问题,等解决问题,放出源码,和大家共享
  • 仪表指针位置识别

    2018-06-03 17:59:07
    用opencv识别出表盘的指针刻度,需要搭配opencv环境,资源包里是一个调用的例子,可以根据实际需要修改,具有一定的参考价值
  • 这现实情况下,要做指针仪表识别,因为各种拍摄角度、光线与指针值的不同,通常需要标注大量素材,而且这种标注相对复制。因此为解决该问题,我使用了迁移学习的方法,下面将详细讲解。 这次将由三部分讲解整个过程...

    这次目标是实现指针仪表方向纠正及指针识别。这现实情况下,要做指针仪表识别,因为各种拍摄角度、光线与指针值的不同,通常需要标注大量素材,而且这种标注相对复杂。因此为解决该问题,我使用了迁移学习的方法,下面将详细讲解。

    将由三部分讲解整个过程:

    1. 搭建Django服务,利用ECharts报表生成虚拟仪表图,作为第一阶段的训练素材。
    2. 编写模型训练与识别代码,并利用虚拟图做预训练,进行方向纠正与指针识别。
    3. 人手标注现实仪表图,并转换成训练素材,进行迁移学习。

    一、创建服务

    创建Django服务可参考官方文档(中文),快速入门部分,文档链接:https://docs.djangoproject.com/zh-hans/3.0/

    # 创建项目
    django-admin startproject ai_server
    
    # 进入项目目录
    cd ai_server
    
    # 创建应用
    python manage.py startapp ai_api

    二、生成图表 

    创建虚拟仪表图生成页面,通过将生成仪表图提交到服务,由服务保存到本地。

    具体参数可查询ECharts官方文档:https://echarts.apache.org/zh/option.html#series-gauge

    在ai_api/static/gauge路径下创建generate_image_save.html文件,内容如下:

    <!DOCTYPE html>
    
    <head>
      <meta charset="utf-8">
      <title>ECharts</title>
    </head>
    
    <body>
      <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
      <div id="main" style="height:400px; width: 400px;"></div>
      <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
      <!-- ECharts单文件引入 -->
      <script src="http://echarts.baidu.com/build/dist/echarts.js"></script>
      <script type="text/javascript">
        function rgb() {//rgb颜色随机
          var r = Math.floor(Math.random() * 256);
          var g = Math.floor(Math.random() * 256);
          var b = Math.floor(Math.random() * 256);
          var rgb = '(' + r + ',' + g + ',' + b + ')';
          return rgb;
        }
        function color16() {//十六进制颜色随机
          var r = Math.floor(Math.random() * 256);
          var g = Math.floor(Math.random() * 256);
          var b = Math.floor(Math.random() * 256);
          var color = '#' + r.toString(16) + g.toString(16) + b.toString(16);
          return color;
        }
        // 路径配置
        require.config({
          paths: {
            echarts: 'http://echarts.baidu.com/build/dist'
          }
        });
    
        // 使用
        require(
          [
            'echarts',
            'echarts/chart/gauge' // 按需加载
          ],
          function (ec) {
            // 基于准备好的dom,初始化echarts图表
            let myChart = ec.init(document.getElementById('main'));
    
            // 为echarts对象加载数据 
            // myChart.setOption(option);
            let updateFun = () => {
              // let startAngle = Math.round(Math.random() * 360)
              // let endAngle = startAngle - Math.round(Math.random() * 300) - 30
              let startAngle = 180 + Math.round(Math.random() * 90) - 45
              let endAngle = 30 + Math.round(Math.random() * 120) - 60
              let option = {
                animation: false,
                // tooltip: {
                //   formatter: "{a} <br/>{b} : {c}%"
                // },
                // toolbox: {
                //   show: true,
                //   feature: {
                //     mark: { show: true },
                //     restore: { show: true },
                //     saveAsImage: { show: true }
                //   }
                // },
                series: [
                  {
                    name: '业务指标',
                    type: 'gauge',
                    legendHoverLink: false,
                    splitNumber: Math.round(Math.random() * 10),       // 分割段数,默认为5
                    startAngle: startAngle,
                    endAngle: endAngle,
                    axisLine: {            // 坐标轴线
                      lineStyle: {       // 属性lineStyle控制线条样式
                        color: [[0.2, color16()], [0.8, color16()], [1, color16()]],
                        width: Math.round(Math.random() * 10) + 3
                      }
                    },
                    axisTick: {            // 坐标轴小标记
                      splitNumber: Math.round(Math.random() * 10),   // 每份split细分多少段
                      length: Math.round(Math.random() * 20),        // 属性length控制线长
                      lineStyle: {       // 属性lineStyle控制线条样式
                        color: color16()
                      }
                    },
                    axisLabel: {           // 坐标轴文本标签,详见axis.axisLabel
                      textStyle: {       // 其余属性默认使用全局文本样式,详见TEXTSTYLE
                        color: color16()
                      }
                    },
                    splitLine: {           // 分隔线
                      show: true,        // 默认显示,属性show控制显示与否
                      length: Math.round(Math.random() * 20) + 25,         // 属性length控制线长
                      lineStyle: {       // 属性lineStyle(详见lineStyle)控制线条样式
                        color: color16()
                      }
                    },
                    pointer: {
                      length: (Math.round(Math.random() * 40) + 60) + '%',
                      width: Math.round(Math.random() * 8) + 1,
                      color: color16()
                    },
                    title: {
                      show: false,
                      offsetCenter: [0, '-40%'],       // x, y,单位px
                      textStyle: {       // 其余属性默认使用全局文本样式,详见TEXTSTYLE
                        fontWeight: 'bolder'
                      }
                    },
                    detail: {
                      show: false,
                      formatter: '{value}%',
                      textStyle: {       // 其余属性默认使用全局文本样式,详见TEXTSTYLE
                        color: color16(),
                        fontWeight: 'bolder'
                      }
                    },
                    data: [{ value: 50, name: '' }]
                  }
                ]
              };
              option.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;
              myChart.setOption(option, true);
              let img = myChart.getDataURL();
              // console.log('图片数据:', img);
              axios.post('/ai_api/gauge/gauge_save', {
                img_data: img,
                value: option.series[0].data[0].value
              })
                .then(function (response) {
                  console.log(response);
                  timeTicket = setTimeout(updateFun, 1);
                })
                .catch(function (error) {
                  console.log(error);
                });
            }
            timeTicket = setTimeout(updateFun, 1);
          }
        );
      </script>
    </body>

    修改ai_server\settings.py文件,在文件最后增加下面代码:

    STATIC_URL = '/static/'
    
    STATICFILES_DIRS = [
        "ai_api/static",
    ]
    
    DATA_UPLOAD_MAX_MEMORY_SIZE = 52428800  #默认设置为50M

     创建视图文件,ai_api\views\gauge.py,将图片保存到本地,代码如下:

    def gauge_save(request):
        '''保存训练图片'''
        global save_num
        save_num += 0.000001
        request_data = json.loads(request.body)
        # print('request_data:', request_data)
        img_data = request_data['img_data'].split(',')[1]
        img_data = image_helpler.base64ToBytes(img_data)
        img = image_helpler.bytesToOpenCVImage(img_data)
        value = request_data['value']
        img_name = ('%s_%.2f.jpg') % (str(save_num), value)
        path = "./image_data/" + img_name
    
        image_helpler.openCVImageToFile(path, img)
    
        jsonObj = {
            "value": value,
        }
        return HttpResponse(json.dumps(jsonObj), content_type="application/json")

    增加接口路由,实际路由地址为:/ai_api/gauge/gauge_save

    增加路由方法请参考Django文档。

    最后用浏览器打开:http://127.0.0.1:8000/static/generate_image_save.html,页面会自动生成图片到文件夹。推荐生成20000以上文件用于作为下一节训练素材。

    效果图

    下一节,将会讲解如何建立模型,进行方向纠正与指针识别。源码会在第三节发布,敬请关注!

    展开全文
  • 我尝试了两种方式用opencv 对指针仪表进行读数识别,1. 先模板匹配,然后边缘检测 + 霍夫直线2. 按轮廓大小过滤,然后边缘检测 + 霍夫直线两种方式对光线都非常敏感其中第一种的应用范围更广,背景复杂一点也能识别...

    我尝试了两种方式

    用opencv 对指针仪表进行读数识别,

    1. 先模板匹配,然后边缘检测 + 霍夫直线

    f6b3c60518989d59aa570bfcef9d25e0.png

    2. 按轮廓大小过滤,然后边缘检测 + 霍夫直线

    b5202793155e24a94446e3ff5d529519.png

    两种方式对光线都非常敏感

    其中第一种的应用范围更广,背景复杂一点也能识别到

    个人比较喜欢这种方式

    第二种的限制多一点,对背景、光线条件要求比较高

    对于固定位置,且明暗变化不大的情况下,这种方式还是很有效的

    先说第一个方案,第二个方式就不说了

    第一种方式:模板匹配,然后边缘检测 + 霍夫直线

    if __name__ == "__main__":

    # 加载模板

    template = cv2.imread('./data/001.jpg',1)

    # 初始化

    am = C_ammerter(template)

    # 运行

    am.am_run()

    # 结束

    am.close()

    模板图 001.jpg

    1dc3a2a62fe487ce65cdd129b8bc24bd.png

    下面给出def am_run(self)函数的处理流程 (整体比较乱~~~)

    其中边缘检测之前需要对图像做一些处理:

    def am_run(self):

    while True:

    ret, frame = self.cap.read()

    if frame is None:

    print('video picture is none --continue ')

    continue

    gray = frame.copy()

    # cv2.imshow('origin', gray)

    # 匹配模板 框出匹配区域

    image = gray.copy()

    maxval,t_left, b_right = self.get_match(gray)

    if maxval < 16000000000: # 对匹配程度做判断

    print("---------------------------------------")

    print('matchTemplate is not enough --continue')

    print("---------------------------------------")

    result =frame

    image=frame

    else:

    cv2.rectangle(image, t_left, b_right, 255, 2)

    # 高斯除噪

    kernel = np.ones((6,6), np.float32) / 36

    gray_cut_filter2D = cv2.filter2D(image[t_left[1]:t_left[1] + self.h, t_left[0]:t_left[0] + self.w], -1, kernel)

    # 灰度图 二值化

    gray_img = cv2.cvtColor(gray_cut_filter2D, cv2.COLOR_BGR2GRAY)

    ret, thresh1 = cv2.threshold(gray_img, 180, 255, cv2.THRESH_BINARY)

    # 二值化后 分割主要区域 减小干扰 模板图尺寸371*369

    tm = thresh1.copy()

    test_main = tm[50:319, 50:321]

    # 边缘化检测

    edges = cv2.Canny(test_main, 50, 150, apertureSize=3)

    # 霍夫直线

    lines = cv2.HoughLines(edges, 1, np.pi / 180, 60)

    if lines is None:

    continue

    result = edges.copy()

    for line in lines[0]:

    rho = line[0] # 第一个元素是距离rho

    theta = line[1] # 第二个元素是角度theta

    print('distance:' + str(rho), 'theta:' + str(((theta / np.pi) * 180)))

    lbael_text = 'distance:' + str(round(rho))+ 'theta:' + str(round((theta / np.pi) * 180-90,2))

    cv2.putText(image, lbael_text,(t_left[0],t_left[1]-12),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)

    if (theta > 3 * (np.pi / 3)) or (theta < (np.pi / 2)): # 从图像边界画出延长直线

    # 该直线与第一行的交点

    pt1 = (int(rho / np.cos(theta)), 0)

    # 该直线与最后一行的焦点

    pt2 = (int((rho - result.shape[0] * np.sin(theta)) / np.cos(theta)), result.shape[0])

    # 绘制一条白线

    cv2.line(result, pt1, pt2,255, 1)

    # print('theat >180 theta<90')

    else: # 水平直线

    # 该直线与第一列的交点

    pt1 = (0, int(rho / np.sin(theta)))

    # 该直线与最后一列的交点

    pt2 = (result.shape[1], int((rho - result.shape[1] * np.cos(theta)) / np.sin(theta)))

    # 绘制一条直线

    cv2.line(result, pt1, pt2, 255, 1)

    cv2.imshow('result', result)

    cv2.imshow('rectangle', image)

    if cv2.waitKey(1) & 0XFF == ord('q'):

    breakjs

    展开全文
  • 仪表识别----指针表识别

    千次阅读 2019-04-17 15:18:39
    最近做了些指标表的商业项目,在工业应用领域使用还是非常广的,鉴于公司的商业机密,用钟表(时针、分针、秒针)做了一个识别...指针识别demo 联系方式:龚先生 微信号:kevingong1982 邮箱 :281093515@qq.com ...

    最近做了些指标表的商业项目,在工业应用领域使用还是非常广的,鉴于公司的商业机密,用钟表(时针、分针、秒针)做了一个识别demo,有这方面类似需求的朋友可以交流。

    指针表识别demo

    联系方式:龚先生
    微信号:kevingong1982
    邮箱 :281093515@qq.com

    展开全文
  • 1、拍摄照片必须清晰,仪表刻度、数字能够清晰分辨。 2、拍摄距离50cm以内,拍摄角度要求水平正视,视角小于5...4、指针仪表准确度达到满量程的1%。 5、软件部署配置费用跟仪表数量成正比,每个仪表配置费按50元。 ...
  • opencv python 对指针仪表读数识别

    热门讨论 2021-01-13 18:57:38
    opencv python 对指针仪表读数识别我尝试了两种方式第一种方式:模板匹配,然后边缘检测 + 霍夫直线需要完整代码留下邮箱 我尝试了两种方式 用opencv 对指针仪表进行读数识别, **1. 先模板匹配,然后边缘检测 + ...
  • 随着电力系统行业对自动化程度的要求不断提高,关于指针仪表识别技术有待进一步改进。传统检测常常忽视阴影的影响,速度及准确性也常常不能满足要求,文章提出一种实用性强的识别算法。首先通过HSV空间变换操作...
  • 基于三次样条插值的指针仪表图像分割方法,首先提取包含指针的圆形区域作为信息图,对信息图进行中值滤波、灰度拉伸;其次使用16个固定的阈值对信息图进行分割,并统计指针的长度和面积;最后使用三次样条插值法对...
  • 指针定位作为仪表识别读数识别的重中之重,其定位是否准确直接决定了最终的读数,因此,需要重点分析一下。本文首先介绍一下Hough直线检测的原理及不足之处,然后使用两种新的方法来定位指针:一种是环向模板匹配...
  • 深度学习的工业应用越来越广,最近用深度学习结合opencv 做了指针仪表识别,鲁棒性很棒,见图 。
  • 指针仪表自动识别和读数

    万次阅读 多人点赞 2019-03-26 10:52:03
    指针仪表自动识别和读数》系列文章 本系列文章是关于“指针仪表的自动读数与识别”,主要内容包括仪表图像预处理、表盘定位、指针定位和读数等,并基于Hough变换(HT)、随机霍夫变换(RHT)等法方,提出了新的圆...
  • 指针仪表角度检测

    千次阅读 2019-01-21 22:29:29
    指针仪表识别的方法,主要流程是: 1,检测仪表所在的位置,提取出来。该方法有两条路径实现,(1)霍夫圆形检测;(2)机器学习训练; 2,检测仪表圆盘的位置后,用霍夫直线检测指针; 3,去除无关直线干扰,...
  • hough变换指针识别

    2018-08-02 14:40:09
    指针仪表识别,透视变换校正倾斜指针,hough变换进行指针提取,最后读数。
  • 这一节,会介绍如何使用现实素材继续训练模型,来完成真正的仪表识别。首先我们会使用标注工具对素材进行标注,然后使用实际标注素材进行训练,编写相应的训练代码。下面,我会逐步介绍如何实现。 一、使用标...
  • 本文将介绍如何利用OpenCV,提取图片中的矩形轮廓特征并进行图片的倾斜校正。...但是由于仪表上存在指针,所以图片在经过轮廓提取直线检测后,会误检出很多条直线。demo程序中主要的算法就是从含有噪声...
  • 【人工智能笔记】第十节 Tensorflow 2.0 实现指针仪表方向纠正及指针识别(上) 这次创建预测模型,用于预测仪表指针值,与用于方向纠正4个点坐标。预测坐标点采用预测4个基准点偏移值的方式,而不是直接预测实际...
  • 嵌入式环境指针仪表快速识别算法研究,曲仁军,徐珍珍,论文在对已有的各种使用图像处理手段进行仪表指针识别方案进行研究的基础上,根据工控环境中指针仪表所具有特点,设计了基于多
  • MATLAB图像处理 控制策略
  • 密码在第十二节: https://blog.csdn.net/highlevels/article/details/104833998
  • 一种新的仪表指针识别方法研究,栾国强,,基于数字图像处理技术的指针仪表自动判读系统中,指针识别是一项关键技术。霍夫变换法、中心投影法等传统的指针识别方法计算量
  • 指针仪表的自动识别,图像处理与图像识别,利用matlab对真个过程进行仿真计算
  • MATLAB识别指针仪表的示数,所用方法为距离法,经过试验,该方法可以较为准确的识别指针仪表的示数,代码中有详细的备注,便于读者理解
  • 指针仪表盘自动识别

    千次阅读 2019-07-01 07:12:16
    利用传统的计算机视觉方法识别仪表盘中的指针 参考链接 yolov3原理和实现参考上篇博客 首先基于yolov3定位出仪表盘的位置,然后剪切仪表盘进行下一步的分析 yolov3检测的IOU可能不是很精准接下来利用霍夫圆检测...
  • 仪表识别材料

    千次阅读 2016-08-01 20:59:18
    指针仪表识别 http://image.hanspub.org:8080/pdf/CSA20130400000_62253244.pdf 智能变电站 ...

空空如也

空空如也

1 2 3 4 5
收藏数 86
精华内容 34
关键字:

指针仪表识别