如何创建opencv数字识别器
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要介绍"如何创建opencv数字识别器"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"如何创建opencv数字识别器"文章能帮助大家解决问题。一、什么
千家信息网最后更新 2025年11月13日如何创建opencv数字识别器
这篇文章主要介绍"如何创建opencv数字识别器"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"如何创建opencv数字识别器"文章能帮助大家解决问题。
一、什么是七段数码显示器
七段LCD数码显示器有很多叫法:段码液晶屏、段式液晶屏、黑白笔段屏、段码LCD液晶屏、段式显示器、TN液晶屏、段码液晶显示器、段码屏幕、笔段式液晶屏、段码液晶显示屏、段式LCD、笔段式LCD等。
如下图,每个数字都由一个七段组件组成。
七段显示器总共可以呈现 128 种可能的状态:
我们要识别其中的0-9,如果用深度学习的方式有点小题大做,并且如果要进行应用还有很多前序工作需要进行,比如要确认识别什么设备的,怎么找到数字区域并进行分割等等。
二、创建opencv数字识别器
我们这里进行使用空调恒温器进行识别,首先整理下流程。
1、定位恒温器上的 LCD屏幕。
2、提取 LCD的图像。
3、提取数字区域
4、识别数字。
我们创建名称为recognize_digits.py的文件,代码如下。仅思路供参考(因为代码中的一些参数只适合测试图片)
# import the necessary packagesfrom imutils.perspective import four_point_transformfrom imutils import contoursimport imutilsimport cv2# define the dictionary of digit segments so we can identify# each digit on the thermostat 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} # load the example imageimage = cv2.imread("example.jpg")## pre-process the image by resizing it, converting it to# graycale, blurring it, and computing an edge mapimage = imutils.resize(image, height=500)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)blurred = cv2.GaussianBlur(gray, (5, 5), 0)edged = cv2.Canny(blurred, 50, 200, 255) # find contours in the edge map, then sort them by their# size in descending ordercnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)cnts = sorted(cnts, key=cv2.contourArea, reverse=True)displayCnt = None# loop over the contoursfor c in cnts: # approximate the contour peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.02 * peri, True) # if the contour has four vertices, then we have found # the thermostat display if len(approx) == 4: displayCnt = approx break # extract the thermostat display, apply a perspective transform# to itwarped = four_point_transform(gray, displayCnt.reshape(4, 2))output = four_point_transform(image, displayCnt.reshape(4, 2)) # threshold the warped image, then apply a series of morphological# operations to cleanup the thresholded imagethresh = cv2.threshold(warped, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1, 5))thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) # find contours in the thresholded image, then initialize the# digit contours listscnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)digitCnts = []# loop over the digit area candidatesfor c in cnts: # compute the bounding box of the contour (x, y, w, h) = cv2.boundingRect(c) # if the contour is sufficiently large, it must be a digit if w >= 15 and (h >= 30 and h <= 40): digitCnts.append(c) # sort the contours from left-to-right, then initialize the# actual digits themselvesdigitCnts = contours.sort_contours(digitCnts, method="left-to-right")[0]digits = [] # loop over each of the digitsfor c in digitCnts: # extract the digit ROI (x, y, w, h) = cv2.boundingRect(c) roi = thresh[y:y + h, x:x + w] # compute the width and height of each of the 7 segments # we are going to examine (roiH, roiW) = roi.shape (dW, dH) = (int(roiW * 0.25), int(roiH * 0.15)) dHC = int(roiH * 0.05) # define the set of 7 segments segments = [ ((0, 0), (w, dH)), # top ((0, 0), (dW, h // 2)), # top-left ((w - dW, 0), (w, h // 2)), # top-right ((0, (h // 2) - dHC) , (w, (h // 2) + dHC)), # center ((0, h // 2), (dW, h)), # bottom-left ((w - dW, h // 2), (w, h)), # bottom-right ((0, h - dH), (w, h)) # bottom ] on = [0] * len(segments) # loop over the segments for (i, ((xA, yA), (xB, yB))) in enumerate(segments): # extract the segment ROI, count the total number of # thresholded pixels in the segment, and then compute # the area of the segment segROI = roi[yA:yB, xA:xB] total = cv2.countNonZero(segROI) area = (xB - xA) * (yB - yA) # if the total number of non-zero pixels is greater than # 50% of the area, mark the segment as "on" if total / float(area) > 0.5: on[i]= 1 # lookup the digit and draw it on the image digit = DIGITS_LOOKUP[tuple(on)] digits.append(digit) cv2.rectangle(output, (x, y), (x + w, y + h), (0, 255, 0), 1) cv2.putText(output, str(digit), (x - 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 255, 0), 2) # display the digitsprint(u"{}{}.{} \u00b0C".format(*digits))cv2.imshow("Input", image)cv2.imshow("Output", output)cv2.waitKey(0)关于"如何创建opencv数字识别器"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
数字
液晶
显示器
段式
液晶屏
识别器
知识
代码
区域
屏幕
恒温
恒温器
数码
行业
不同
实用
小题大做
内容
参数
叫法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
物联网软件开发用什么软件
英雄联盟外国服务器皮肤
阿里核心数据库
数据库试卷打包
企业信息网络安全监管体系
关于计算机软件开发论文
互联网软件开发退税吗
小南瓜技术屋-专注网络技术分享
网络安全专业能在之江实验室
附小网络安全课堂
网络安全大赛的解说
软件开发服务费数量单位
蓝色科技互联网宣传
上海网络安全软件的公司
持有网络安全概念股
戴尔服务器通电自动开机设置
达芬奇软件用什么数据库更好
dns服务器准入
网络安全法 黑客
世嘉的服务器一般在哪
前锦网络技术
数据库 数据交换 视频
网络技术综合实训是什么
崩溃大陆连接服务器失败
注册表编辑器数据库
金山区人工智能应用软件开发优点
常州java软件开发在线咨询
论文收录中国主流数据库
中国平安科技概念互联网股
大数据数据库安全解决方案