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网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
Python中执行存储过程及获取存储过程返回值的方法
Oct 07 Python
Python快速排序算法实例分析
Nov 29 Python
Python使用base64模块进行二进制数据编码详解
Jan 11 Python
Python装饰器的执行过程实例分析
Jun 04 Python
python re模块的高级用法详解
Jun 06 Python
Django rest framework工具包简单用法示例
Jul 20 Python
python实现汽车管理系统
Nov 30 Python
python实现串口通信的示例代码
Feb 10 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
python else语句在循环中的运用详解
Jul 06 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递归方法实现无限分类实例代码
2014/02/28 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
JavaScript的Date()方法使用详解
2015/06/09 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
简单的js计算器实现
2016/10/26 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
Python 模板引擎的注入问题分析
2017/01/01 Python
Django 前后台的数据传递的方法
2017/08/08 Python
Python制作exe文件简单流程
2019/01/24 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
python 实现超级玛丽游戏
2020/11/25 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
三月学雷锋活动总结
2014/06/26 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
整脏治乱工作简报
2015/07/21 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python