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实现监控linux性能及进程消耗性能的方法
Jul 25 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
Dec 14 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
对Python w和w+权限的区别详解
Jan 23 Python
Django model 中设置联合约束和联合索引的方法
Aug 06 Python
Python学习笔记之For循环用法详解
Aug 14 Python
python web框架 django wsgi原理解析
Aug 20 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
Python可视化学习之seaborn绘制矩阵图详解
Feb 24 Python
Python内置包对JSON文件数据进行编码和解码
Apr 12 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 IF ELSE简化/三元一次式的使用
2011/08/22 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
php中使用websocket详解
2016/09/23 PHP
php取出数组单个值的方法
2018/03/12 PHP
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
javascript数组详解
2014/10/22 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
javascript实现画板功能
2020/04/12 Javascript
Vue将props值实时传递 并可修改的操作
2020/08/09 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
python Pygame的具体使用讲解
2017/11/03 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
简单的Python调度器Schedule详解
2019/08/30 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
毕业生优秀推荐信
2013/11/26 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
2016特色励志班级口号
2015/12/24 职场文书