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基础教程之基本内置数据类型介绍
Feb 20 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
Python numpy线性代数用法实例解析
Nov 15 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
Dec 13 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
如何解决pycharm调试报错的问题
Aug 06 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
Dec 07 Python
聊聊python在linux下与windows下导入模块的区别说明
Mar 03 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
当海贼王变成JOJO风
2020/03/02 日漫
Home Coffee Roasting
2021/03/03 咖啡文化
配置支持SSI
2006/11/25 PHP
PHP 远程关机实现代码
2009/11/10 PHP
关于PHP实现异步操作的研究
2013/02/03 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
jquery横向纵向鼠标滚轮全屏切换
2017/02/27 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
详解写好JS条件语句的5条守则
2019/02/28 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
深入浅析python定时杀进程
2016/06/06 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python中count函数简单的实例讲解
2020/02/06 Python
Python实现AI换脸功能
2020/04/10 Python
CSS3实现超酷的黑猫警长首页
2016/04/26 HTML / CSS
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
餐饮业的创业计划书范文
2013/12/26 职场文书
访谈节目策划方案
2014/05/15 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
关于五一放假的通知
2015/08/18 职场文书