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字符串编码识别模块chardet简单应用
Jun 15 Python
详解python之配置日志的几种方式
May 22 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
Nov 29 Python
Python中协程用法代码详解
Feb 10 Python
利用nohup来开启python文件的方法
Jan 14 Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
Python内置加密模块用法解析
Nov 25 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
Apr 07 Python
快速解决jupyter启动卡死的问题
Apr 10 Python
python爬虫要用到的库总结
Jul 28 Python
Python+DeOldify实现老照片上色功能
Jun 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
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
jQuery设置和获取HTML、文本和值示例
2014/07/08 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
JS 打印功能代码可实现打印预览、打印设置等
2014/10/31 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
微信小程序request出现400的问题解决办法
2017/05/23 Javascript
React简单介绍
2017/05/24 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
python 域名分析工具实现代码
2009/07/15 Python
python中文件变化监控示例(watchdog)
2017/10/16 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
python3 反射的四种基本方法解析
2019/08/26 Python
Python Subprocess模块原理及实例
2019/08/26 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
物流管理毕业生自荐信
2013/10/24 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
护士自我鉴定总结
2014/03/24 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书