opencv python 对指针仪表读数识别的两种方式


Posted in Python onJanuary 14, 2021

我尝试了两种方式

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

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

opencv python 对指针仪表读数识别的两种方式

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

opencv python 对指针仪表读数识别的两种方式

两种方式对光线都非常敏感
其中第一种的应用范围更广,背景复杂一点也能识别到
个人比较喜欢这种方式

第二种的限制多一点,对背景、光线条件要求比较高
对于固定位置,且明暗变化不大的情况下,这种方式还是很有效的

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

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

if __name__ == "__main__":
  # 加载模板
  template = cv2.imread('./data/001.jpg',1)
  # 初始化
  am = C_ammerter(template)
  # 运行
  am.am_run()
  # 结束
  am.close()

模板图 001.jpg

opencv python 对指针仪表读数识别的两种方式

下面给出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'):
        break

到此这篇关于opencv python 对指针仪表读数识别的两种方式的文章就介绍到这了,更多相关opencv python指针仪表读数识别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 调用DLL操作抄表机
Jan 12 Python
Python的ORM框架SQLObject入门实例
Apr 28 Python
基python实现多线程网页爬虫
Sep 06 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
Jul 24 Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 Python
详解numpy的argmax的具体使用
May 27 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
Jul 31 Python
用Python进行websocket接口测试
Oct 16 Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 Python
详解如何使用Pytest进行自动化测试
Jan 14 #Python
matplotlib对象拾取事件处理的实现
Jan 14 #Python
用python查找统一局域网下ip对应的mac地址
Jan 13 #Python
python 写一个水果忍者游戏
Jan 13 #Python
python中编写函数并调用的知识点总结
Jan 13 #Python
Python jieba库分词模式实例用法
Jan 13 #Python
python中yield的用法详解
Jan 13 #Python
You might like
基于PHPExcel的常用方法总结
2013/06/13 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
javascript的函数
2007/01/31 Javascript
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
python爬取网页内容转换为PDF文件
2020/07/28 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
DNA基因检测和分析:23andMe
2019/05/01 全球购物
办公室前台的岗位职责
2013/12/20 职场文书
教师个人鉴定材料
2014/02/08 职场文书
大学生党员自我批评
2014/02/14 职场文书
小学校长个人总结
2015/03/03 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书