(Python)大小符识别之基于opencv穿线法的数码管识别_穿线法识别数字代码_我叫夏满满的博客-程序员秘密

技术标签: python  计算机视觉  穿线法  opencv  

一、问题

女朋友的大作业第一题选自于robomaster的题目,机器人需要通过摄像头先识别数码管区域的 5 个密码数字,然后控制射击机构依照顺序用塑料子弹击打九宫格区域内对应的数字。因此需要对数码管进行识别。下面是题目要求。

二、分析

对于数码管的识别,可以利用简单的穿线法。

图像的分割可以利用opencv中自带的函数。

将图片转换为HSV格式可以更好分割。

三、代码

1.转换成hsv格式,利用hsv格式进行筛选,其中筛选参数lower,upper需要根据自己情况来设定。

hsv = cv2.cvtColor(image_org, cv2.COLOR_BGR2HSV)

lower = np.array([h0, s0, v0])
upper = np.array([h1, s1, v1])

image_gray = cv2.inRange(hsv, lower, upper)

 

2.对hsv图像进行高斯滤波,二值化处理

image_gray = cv2.GaussianBlur(image_gray, (7, 7), 0)
ret, image_bin = cv2.threshold(image_gray, 200, 255, cv2.THRESH_BINARY)

3.进行形态学处理,利用闭运算处理。

cv2.morphologyEx(image_bin, cv2.MORPH_CLOSE, kernel2, iterations=1)

4. 运用cv2.findContours得到边界,下图是可视化边界的样图。

5.对上述的得到的边框进行位置以及大小的筛选,进行穿线法识别,下面是穿线法的代码。

def TubeIdentification(filename, num, image):
    tube = 0
    tubo_roi = [
         [image.shape[0] * 0/3, image.shape[0] * 1/3, image.shape[1] * 1/2, 
                                                      image.shape[1] * 1/2],
         [image.shape[0] * 1/3, image.shape[0] * 1/3, image.shape[1] * 2/3, 
                                                      image.shape[1] - 1  ],
         [image.shape[0] * 2/3, image.shape[0] * 2/3, image.shape[1] * 2/3, 
                                                      image.shape[1] - 1  ],
         [image.shape[0] * 2/3, image.shape[0] -1   , image.shape[1] * 1/2, 
                                                      image.shape[1] * 1/2],
         [image.shape[0] * 2/3, image.shape[0] * 2/3, image.shape[1] * 0/3, 
                                                      image.shape[1] * 1/3],
         [image.shape[0] * 1/3, image.shape[0] * 1/3, image.shape[1] * 0/3, 
                                                      image.shape[1] * 1/3],
         [image.shape[0] * 1/3, image.shape[0] * 2/3, image.shape[1] * 1/2, 
                                                      image.shape[1] * 1/2]] 
    i = 0
    while(i < 7):
        if(Iswhite(image, int(tubo_roi[i][0]), int(tubo_roi[i][1]), 
            int(tubo_roi[i][2]),int(tubo_roi[i][3]))):
            tube = tube + pow(2,i)
            
        cv2.line(image, ( int(tubo_roi[i][3]),int(tubo_roi[i][1])), 
                (int(tubo_roi[i][2]), int(tubo_roi[i][0])),                
                (255,0,0), 1)                       
        i += 1
 
    if(tube==63):
        onenumber = 0
    elif(tube==6):
        onenumber = 1
    elif(tube==91):
        onenumber = 2
    elif(tube==79):
        onenumber = 3
    elif(tube==102 or tube==110):
    #110是因为有干扰情况
        onenumber = 4
    elif(tube==109):
        onenumber = 5
    elif(tube==125):
        onenumber = 6
    elif(tube==7):
        onenumber = 7
    elif(tube==127):
        onenumber = 8
    elif(tube==103):
        onenumber = 9
    else:
        onenumber = -1 
               
    cv2.imwrite(filename + '_' + str(num) + '_' + str(onenumber) + '.png', image)
    return onenumber      
 
def Iswhite(image, row_start, row_end, col_start, col_end):
    white_num = 0
    j=row_start
    i=col_start
 
    while(j <= row_end):
        while(i <= col_end):
            if(image[j][i] == 255):                
                white_num+=1
            i+=1
        j+=1
        i=col_start
    #print('white num is',white_num)
    if(white_num >= 5):
        return True
    else:
        return False
 

6.最终得到结果(未按顺序输出)

四、改进

可以利用神经网络来做,这样准确率很高,鲁棒性强。但是需要自己做数据集,麻烦。

五、参考

https://blog.csdn.net/zong596568821xp/article/details/85098590

https://blog.csdn.net/km2km2km/article/details/94778305

https://blog.csdn.net/sandalphon4869/article/details/95398033

https://blog.csdn.net/spw_1201/article/details/78310349

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42479394/article/details/118348572

智能推荐

TensorFlow构建模型(图片数据加载)六_keras.utils.image_dataset_from_directory循环整个目录_superY25的博客-程序员秘密

本文内容来源于TensorFlow教程本文主要介绍了三种图片数据的加载和预处理方法:使用高级的Keras预处理工具(如tf.keras.utils.image_dataset_from_directory)和预处理层(如tf.keras.layers.Rescaling)从磁盘的图片目录中加载数据。使用tf.data的框架写你自己的输入通道。在TensorFlow Datasets中从可用的类别加载数据集。

speechbrain 分词speechbrain.tokenizers.SentencePiece_tokenizers utf-8_楚歌汉水的博客-程序员秘密

这个分词主要针对的是英文,其中在speechbrain.tokenizers.SentencePiece文件中有一个open读取操作,其默认的是gbk,而自己保存的文件格式是utf-8,所以这个文件读取时会出现乱码情况,所以将所有open,添加 encoding="utf-8"而且需要注意,分词相关的文件,一定不能错,以前的错误文件会对自己造成干扰做个记录,方便以后查看...

构建虚拟化服务器内存类型指南_weixin_34249678的博客-程序员秘密

当前,虚拟化业已成为常态,了解虚拟化类型能更好的了解此技术对数据中心产生的不同影响。与时俱进的了解服务器内存类型随着虚拟化的发展,内存已成为运算时的重要资源,其在使用性能上以及配置参数方面的发展随着虚拟化的发展也在发生着变化;对于数据中心IT人员而言,及时了解服务器的内存类型、运算性能,保障数据中心运算性能更高是很有必要的。保护服务器的可靠性内存能...

【TensorRT系列笔记-01】TensorRT 5.0.2.6 安装_caicaiatnbu的博客-程序员秘密

官方下载地址:https://developer.nvidia.com/nvidia-tensorrt-5x-download选择对应版本,根据你的OS以及CUDA选择对应的版本,如下图所示:对下载好的文件进行更名,并解压;tar -xzvf TensorRT-5.0.2.6.tar.gz配置环境变量:vim ~/.bashrc添加环境变量:exp...

max virtual memory areas vm.max_map_count [65530]_weixin_33875839的博客-程序员秘密

一、故障现象# 启动ELK容器时报错:# docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk[1] bootstrap checks failed[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase...

Linux CPU、内存监控命令详解_linux,内存监控_lovemelovemycode的博客-程序员秘密

查看多核CPU命令mpstat -P ALL  和  sar -P ALL 说明:sar -P ALL > aaa.txt   重定向输出内容到文件 aaa.txttop命令经常用来监控linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令,但比较奇怪的是能用好它的人却很少,例如top监控视图中内存数值的含义就有不少的曲解。本文通过一个运行中的WEB服务器的top监

随便推点

SET ROWCOUNT 1 与 TOP(1) 的区别_光义的博客-程序员秘密

 SET ROWCOUNT  1 与 TOP(1) 的区别 都能实现只取得一条语句。。 使 SQL Server 在返回指定的行数之后停止处理查询。 Transact-SQL 语法约定语法 SET ROWCOUNT { number | @number_var } 参数number | @numbe

php中创建和调用webservice接口示例_xueling022的博客-程序员秘密

作为开发者来讲,要想写webservice接口或者调用别人的webservice接口,首先需要了解什么是webservice。简单说, WebService就是一些站点开放一些服务出来, 也可以是你自己开发的Service, 也就是一些方法, 通过URL,指定某一个方法名,发出请求,站点里的这个服务(方法),接到你的请求,根据传过来的参数,做一些处理,然后把处理后的结果以XML形式返回来给你,你的

PHP开发群控,玩客云改群控的试玩体验,群控插件开发原来如此简单_东予薏米的博客-程序员秘密

认识众多玩家高手/拆客/DIYer,查阅更多资源,一起学习技术知识您需要 登录 才可以下载或查看,没有帐号?立即注册x上周参加小融的活动,把自己手里两台玩客云刷成了群控系统。刷机免费,开放API接口,可以自由上传插件,可玩性还是比较高的。这周找了一天时间写了个简单的测试脚本,跑了一下,体验还不错。然后还发现小融在办群控插件开发大赛,任意插件都可以,所以准备周末再写个能赚零零花钱的自动阅读插件,看能...

从零开始学 Web 之 HTML5(四)拖拽接口,Web存储,自定义播放器_黄小二哥的博客-程序员秘密

大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新......github:https://github.com/Daotin/Web微信公众号:Web前端之巅博客园:http://www.cnblogs.com/lvonve/CSDN:https://blog.csdn.net/lvonve/在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知...

linux网卡重启失败错误_kjsayn的博客-程序员秘密

重启网卡的时候会报找不到网卡报:FATAL: Module off not found.的错误。

BZOJ1861 [Zjoi2006]Book 书架_weixin_30505225的博客-程序员秘密

Splay维护操作。学习了一个很好的remove操作。 1 #include&lt;bits/stdc++.h&gt; 2 using namespace std; 3 const int N=8e4+5; 4 const int inf=1e9; 5 int fa[N],c[N][2],size[N],pos[N],a[N],v[N],n,m,rt; ...

推荐文章

热门文章

相关标签