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 输出一个两行字符的变量
Feb 05 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 Python
python通过文件头判断文件类型
Oct 30 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
python实现外卖信息管理系统
Jan 11 Python
Python实现通讯录功能
Feb 22 Python
python smtplib模块自动收发邮件功能(二)
May 22 Python
python try except 捕获所有异常的实例
Oct 18 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
浅析python标准库中的glob
Mar 13 Python
Python类class参数self原理解析
Nov 19 Python
python实现简单聊天功能
Jul 07 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
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
js下用eval生成JSON对象
2010/09/17 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
vue中watch和computed的区别与使用方法
2020/08/23 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
Python中List.count()方法的使用教程
2015/05/20 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
python实现可变变量名方法详解
2019/07/01 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
美国性感内衣店:Yandy
2018/06/12 全球购物
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
优秀班集体先进事迹材料
2014/05/28 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
python的html标准库
2022/04/29 Python
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python