本文主要介绍了opencv python识别七段数码显示器的数字(数字识别),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
目录
一、什么是七段数码显示器二、创建opencv数字识别器
一、什么是七段数码显示器
七段液晶显示数码显示器有很多叫法:段码液晶屏、段式液晶屏、黑白笔段屏、段码液晶显示液晶屏、段式显示器、TN液晶屏、段码液晶显示器、段码屏幕、笔段式液晶屏、段码液晶显示屏、段式液晶显示器、笔段式液晶显示等。
如下图,每个数字都由一个七段组件组成。
七段显示器总共可以呈现128 种可能的状态:
我们要识别其中的0-9,如果用深度学习的方式有点小题大做,并且如果要进行应用还有很多前序工作需要进行,比如要确认识别什么设备的,怎么找到数字区域并进行分割等等。
二、创建opencv数字识别器
我们这里进行使用空调恒温器进行识别,首先整理下流程。
1、定位恒温器上的液晶显示屏幕。
2、提取液晶显示的图像。
3、提取数字区域
4、识别数字。
我们创建名称为recognize_digits.py的文件,代码如下。仅思路供参考(因为代码中的一些参数只适合测试图片)
#导入必要的包
从imutils .透视导入四点转换
从imutils导入轮廓
导入imutils
导入cv2
#定义数字段字典,以便我们可以识别
#恒温器上的每个数字
DIGITS_LOOKUP={
(1, 1, 1, 0, 1, 1, 1): 0,
(0, 0, 1, 0, 0, 1, 0): 1,
(1, 0, 1, 1, 1, 1, 0): 2,
(1, 0, 1, 1, 0, 1, 1): 3,
(0, 1, 1, 1, 0, 1, 0): 4,
(1, 1, 0, 1, 0, 1, 1): 5,
(1, 1, 0, 1, 1, 1, 1): 6,
(1, 0, 1, 0, 0, 1, 0): 7,
(1, 1, 1, 1, 1, 1, 1): 8,
(1, 1, 1, 1, 0, 1, 1): 9
}
#加载示例图像
image=cv2。im read('例如。jpg ')#
#通过调整图像大小、将其转换为
#灰度、模糊它并计算边缘图
image=imutils.resize(image,height=500)
gray=cv2.cvtColor(image,cv2 .COLOR_BGR2GRAY)
模糊=cv2 .高斯-布朗(灰色,(5,5),0)
edged=cv2 .Canny(模糊,50,200,255)
#在边缘图中找到轮廓,然后按它们的
#大小按降序排列
CNTs=cv2。查找轮廓(边缘。复制(),cv2 .RETR _外部,cv2 .CHAIN_APPROX_SIMPLE)
CNTs=IMU tils。抓取轮廓(CNT)
cnts=sorted(cnts,key=cv2.contourArea,reverse=True)
显示计数=无
#在轮廓上循环
对于碳纳米管中的碳:
#近似轮廓
peri=cv2.arcLength(c,True)
approx=cv2.approxPolyDP(c,0.02 * peri,True)
#如果轮廓有四个顶点,那么我们发现
#恒温器显示
如果len(近似值)==4:
显示计数=大约
破裂
#提取恒温器显示,应用透视变换
#去吧
warped=four _ point _ transform(灰色,显示内容。形状(4,2))
output=four _ point _ transform(图像,显示CNT。形状(4,2))
#对扭曲的图像进行阈值处理,然后应用一系列形态学
#清除阈值图像的操作
thresh=cv2.threshold扭曲,0,255,cv2 .THRESH_BINARY_INV | cv2 .THRESH_OTSU)[1]
内核=cv2。getstructuringelement(cv2 .变形_椭圆,(1,5))
thresh=cv2.morphologyEx(thresh,cv2 .MORPH_OPEN,内核)
#在阈值图像中查找轮廓,然后初始化
#数字等高线列表
CNTs=cv2。查找轮廓(thresh。复制(),cv2 .RETR _外部,cv2 .CHAIN_APPROX_SIMPLE)
CNTs=IMU tils。抓取轮廓(CNT)
数字内容=[]
#在候选数字区域循环
对于碳纳米管中的碳:
#计算轮廓的边界框
(x,y,w,h)=cv2.boundingRect(c)
#如果轮廓足够大,它必须是一个数字
如果w=15且(h=30且h=40):
数字内容。追加(三)
#从左到右对轮廓进行排序,然后初始化
#实际数字本身
数字计数=轮廓。sort _ contours(数字计数,method='从左到右')[0]
数字=[]
#循环每个数字
对于数字中的丙:
#提取数字投资收益率
(x,y,w,h)=cv2.boundingRect(c)
roi=thresh[y:y h,x:x w]
#计算七个线段的宽度和高度
#我们将检验
(roi,roiW)=roi.shape
(dW,dH)=(int(roiW * 0.25),int(roiH * 0.15))
dHC=int(roiH * 0.05)
#定义七段的集合
细分=[
((0,0),(w,dH)),# top
((0,0),(dW,h //2)),#左上角
((w - dW,0),(w,h //2)),#右上
((0,(h //2) - dHC),(w,(h //2) dHC)),# center
((0,h //2),(dW,h)),#左下角
((w - dW,h //2),(w,h)),#右下
((0,h - dH),(w,h))#底部
]
on=[0] * len(段)
#在片段上循环
对于枚举(段)中的(I,((xA,yA),(xB,yB)):
#提取该段ROI,统计其总数
#分割中的阈值像素,然后计算
#线段的面积
segROI=roi[yA:yB,xA:xB]
总计=cv2。数数非零(赛格罗伊)
面积=(xB - xA) * (yB - yA)
#如果非零像素的总数大于
# 50%的区域,将该段标记为"开"
如果总/浮动(面积)为0.5:
on[i]=1
#查找数字并将其画在图像上
digit=DIGITS_LOOKUP[tuple(on)]
数字.追加(数字)
cv2 .矩形(输出,(x,y),(x w,y h),(0,255,0),1)
cv2.putText(输出,字符串(数字)、(x - 10,y - 10),
cv2 .FONT_HERSHEY_SIMPLEX,0.65,(0,255,0),2)
#显示数字
print(u'{}{} .{} \u00b0C ' .格式(*数字))
cv2.imshow('输入,图像)
cv2.imshow('Output ',输出)
cv2.waitKey(0)
原始图片
边缘检测
识别的结果图片
到此这篇关于opencv python识别七段数码显示器的数字(数字识别)的文章就介绍到这了,更多相关opencv数字识别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。