opencv+python识别七段数码显示器的数字(数字识别)

 更新时间:2022年01月12日 11:14:23   作者:bashendixie5  
本文主要介绍了opencv+python识别七段数码显示器的数字(数字识别),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、什么是七段数码显示器

        七段LCD数码显示器有很多叫法:段码液晶屏、段式液晶屏、黑白笔段屏、段码LCD液晶屏、段式显示器、TN液晶屏、段码液晶显示器、段码屏幕、笔段式液晶屏、段码液晶显示屏、段式LCD、笔段式LCD等。

        如下图,每个数字都由一个七段组件组成。

图 2:单个七段显示器的示例。 每个段都可以“打开”或“关闭”以表示特定的数字。

        七段显示器总共可以呈现 128 种可能的状态:

        我们要识别其中的0-9,如果用深度学习的方式有点小题大做,并且如果要进行应用还有很多前序工作需要进行,比如要确认识别什么设备的,怎么找到数字区域并进行分割等等。

二、创建opencv数字识别器

         我们这里进行使用空调恒温器进行识别,首先整理下流程。

        1、定位恒温器上的 LCD屏幕。

        2、提取 LCD的图像。

        3、提取数字区域

        4、识别数字。

 我们创建名称为recognize_digits.py的文件,代码如下。仅思路供参考(因为代码中的一些参数只适合测试图片)

# import the necessary packages
from imutils.perspective import four_point_transform
from imutils import contours
import imutils
import 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 image
image = cv2.imread("example.jpg")#
# pre-process the image by resizing it, converting it to
# graycale, blurring it, and computing an edge map
image = 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 order
cnts = 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 contours
for 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 it
warped = 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 image
thresh = 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 lists
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
digitCnts = []
# loop over the digit area candidates
for 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 themselves
digitCnts = contours.sort_contours(digitCnts, method="left-to-right")[0]
digits = []
 
# loop over each of the digits
for 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 digits
print(u"{}{}.{} \u00b0C".format(*digits))
cv2.imshow("Input", image)
cv2.imshow("Output", output)
cv2.waitKey(0)

原始图片

边缘检测

识别的结果图片

到此这篇关于opencv+python识别七段数码显示器的数字(数字识别)的文章就介绍到这了,更多相关opencv数字识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中*args和**kwargs的作用

    Python中*args和**kwargs的作用

    *args和**kwargs,以及单独的*,**到底是啥作用呢?原理是啥呢?读完这篇文章你就彻底明白了,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • Python中可复用函数的6种实践

    Python中可复用函数的6种实践

    为了实现可维护性,我们的Python函数应该:小型、只做一项任务;没有重复;有一个层次的抽象性;有一个描述性的名字和有少于四个参数,下面我们就来看看这6个特性的实践吧
    2023-08-08
  • Django项目创建的图文教程

    Django项目创建的图文教程

    本文主要介绍了Django项目创建的图文教程,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Python脚本实现虾米网签到功能

    Python脚本实现虾米网签到功能

    这篇文章主要介绍了Python脚本实现虾米网签到功能的方法,涉及Python调用URL模块实现数据传输与处理的相关技巧,需要的朋友可以参考下
    2016-04-04
  • 如何利用Python+Vue实现简单的前后端分离

    如何利用Python+Vue实现简单的前后端分离

    因为python开发的高效性,python web开发也受到越来越多人的关注,下面这篇文章主要给大家介绍了关于如何利用Python+Vue实现简单的前后端分离的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • python2 与 python3 实现共存的方法

    python2 与 python3 实现共存的方法

    这篇文章主要介绍了python2 与 python3 实现共存的方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • python实现微信自动回复功能

    python实现微信自动回复功能

    这篇文章主要为大家详细介绍了使用python实现微信自动回复功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • python中将一个全部为int的list 转化为str的list方法

    python中将一个全部为int的list 转化为str的list方法

    下面小编就为大家分享一篇python中将一个全部为int的list 转化为str的list方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 使用Python操作MySQL数据库的教程详解

    使用Python操作MySQL数据库的教程详解

    在这篇文章中,主要为大家详细介绍如何在Python中使用pymysql模块来操作MySQL数据库,文中的示例代码简介易懂,需要的小伙伴可以跟随小编一起学习一下
    2023-07-07
  • 简单示例入门了解Python TkInter框架

    简单示例入门了解Python TkInter框架

    这篇文章主要为大家通过简单示的示例带大家入门了解Python TkInter框架,让大家对Python TkInter有一个简单的认知,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2023-11-11

最新评论