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抓取京东商城手机列表url实例代码
Dec 18 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
Python正则简单实例分析
Mar 21 Python
通过源码分析Python中的切片赋值
May 08 Python
python使用__slots__让你的代码更加节省内存
Sep 05 Python
深入浅析Python2.x和3.x版本的主要区别
Nov 30 Python
详解pytorch 0.4.0迁移指南
Jun 16 Python
pytorch读取图像数据转成opencv格式实例
Jun 02 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 Python
python实现图片批量压缩
Apr 24 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设计模式 php实现状态模式
2015/12/07 PHP
round robin权重轮循算法php实现代码
2016/05/28 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
JQuery 入门实例1
2009/06/25 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
跟老齐学Python之Import 模块
2014/10/13 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python与Java间Socket通信实例代码
2017/03/06 Python
python dlib人脸识别代码实例
2019/04/04 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
自定义django admin model表单提交的例子
2019/08/23 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
一款纯css3实现的非常实用的鼠标悬停特效演示
2014/11/05 HTML / CSS
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
高校学生干部的自我评价分享
2013/11/04 职场文书
目标责任书范本
2014/04/16 职场文书
留学生求职信
2014/06/03 职场文书
运动会新闻稿
2015/07/17 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书