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 相关文章推荐
详解Django通用视图中的函数包装
Jul 21 Python
Python中的字符串替换操作示例
Jun 27 Python
详解如何使用Python编写vim插件
Nov 28 Python
python版微信跳一跳游戏辅助
Jan 11 Python
详解Python3.6的py文件打包生成exe
Jul 13 Python
对python文件读写的缓冲行为详解
Feb 13 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
python requests证书问题解决
Sep 05 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 Python
使用Pytorch实现two-head(多输出)模型的操作
May 28 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
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
从阿里妈妈发现的几个不错的表单验证函数
2007/09/21 Javascript
Jquery 扩展方法
2010/05/06 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
Python三元运算实现方法
2015/01/12 Python
详解python基础之while循环及if判断
2017/08/24 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
python实现各种插值法(数值分析)
2019/07/30 Python
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
团组织关系介绍信
2014/01/12 职场文书
老总助理工作岗位职责
2014/02/06 职场文书
篮球比赛口号
2014/06/10 职场文书
学校四群教育实施方案
2014/06/12 职场文书
药店促销活动总结
2014/07/10 职场文书
公证处委托书
2015/01/28 职场文书
公积金贷款承诺书
2015/04/30 职场文书
矛盾论读书笔记
2015/06/29 职场文书
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL
Go语言并发编程 sync.Once
2021/10/16 Golang
分享7个 Python 实战项目练习
2022/03/03 Python