如何创建opencv数字识别器
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍"如何创建opencv数字识别器"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"如何创建opencv数字识别器"文章能帮助大家解决问题。一、什么
千家信息网最后更新 2026年11月04日如何创建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安全错误
数据库的锁怎样保障安全
高科技互联网
国智互联网科技
美国互联网保险保险科技
重庆互联网络科技
互联网金融公司科技
奇酷互联网科技
迪茉互联网科技
猫创互联网科技
阿里巴巴算科技企业还是互联网
互联网企业和科技型企业
现代互联网科技股
来此购互联网科技有限公司
上海宁丞科技互联网
速维有品互联网信息科技(苏州)有限公司
想开互联网科技公司怎么样
科技大学互联网
现代互联网科技公司
互联网领先科技成果宣传视频
科技互联网专业务虚会材料
互联网科技创业计划的风险分析
深圳恒合互联网络科技有限公司
南京欣网互联网科技
太原新华互联网科技学校怎么样
互联网汽车科技小镇
互联网校园科技培训
玉溪互联网科技怎么选
互联网媒体平台算高科技产业
允成互联网科技有限公司融资
互联网企业科技类企业如何做账
广州智享互联网科技