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实现中文输出的两种方法
May 09 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
用python实现百度翻译的示例代码
Mar 09 Python
TensorFlow变量管理详解
Mar 10 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
Python从函数参数类型引出元组实例分析
May 28 Python
Python日志无延迟实时写入的示例
Jul 11 Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 Python
Python paramiko使用方法代码汇总
Nov 20 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 Python
Python OpenGL基本配置方式
May 20 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获得当前的脚本网址
2007/12/10 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
Yii使用migrate命令执行sql语句的方法
2016/03/15 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
php桥接模式应用案例分析
2019/10/23 PHP
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
卸载安装Node.js与npm过程详解
2016/08/15 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
python实现批量按比例缩放图片效果
2018/03/30 Python
详解Python正则表达式re模块
2019/03/19 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
python序列类型种类详解
2020/02/26 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
煤矿安全生产责任书
2014/04/15 职场文书
个人委托书范本汇总
2014/10/01 职场文书
秦兵马俑导游词
2015/02/02 职场文书
自荐信模板大全
2015/03/27 职场文书
培根随笔读书笔记
2015/07/01 职场文书
小程序自定义轮播图圆点组件
2022/06/25 Javascript
TS 类型兼容教程示例详解
2022/09/23 Javascript