欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python+Opencv實現(xiàn)數(shù)字識別的示例代碼

 更新時間:2021年03月22日 10:12:01   作者:技術(shù)挖掘者  
這篇文章主要介紹了Python+Opencv實現(xiàn)數(shù)字識別的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、什么是數(shù)字識別?

  所謂的數(shù)字識別,就是使用算法自動識別出圖片中的數(shù)字。具體的效果如下圖所示:

在這里插入圖片描述

上圖展示了算法的處理效果,算法能夠自動的識別到LCD屏幕上面的數(shù)字,這在現(xiàn)實場景中具有很大的實際應(yīng)用價值。下面我們將對它的實現(xiàn)細節(jié)進行詳細解析。

二、如何實現(xiàn)數(shù)字識別?

  對于數(shù)字識別這個任務(wù)而言,它并不是一個新的研究方向,很久之前就有很多的學(xué)者們在關(guān)注這個問題,并提出了一些可行的解決方案,本小節(jié)我們將對這些方案進行簡單的總結(jié)。

方案一:使用現(xiàn)成的OCR技術(shù)。 OCR,即文字識別,它是一個比較成熟的技術(shù),當(dāng)前已經(jīng)具有很多性能優(yōu)異的開源工具包可以供大家使用,即我們僅僅需要關(guān)注的是如何調(diào)用這些接口即可,如何你想要了解它們的實現(xiàn)細節(jié),那么你就需要去詳細的理解源碼啦。除此之外,當(dāng)前的OCR算法已經(jīng)可以很好的識別圖像中的簡單文字和數(shù)字等,當(dāng)前研究的一個熱點是如何準(zhǔn)確快速的識別出圖片中的傾斜文本和不同語言的文字等,下圖展示了一個簡單的識別樣例,即識別筆筒上面的文字。

在這里插入圖片描述

方案二:使用深度神經(jīng)網(wǎng)絡(luò)。 隨著深度學(xué)習(xí)技術(shù)的快速發(fā)展,神經(jīng)網(wǎng)絡(luò)被引入到計算機視覺當(dāng)中的多個領(lǐng)域中,對于數(shù)字識別這個簡單的任務(wù)而言,神經(jīng)網(wǎng)絡(luò)可以獲得準(zhǔn)確的識別結(jié)果,比較有名的是mnist數(shù)據(jù)集。但是這種方法首先需要用戶收集大量的數(shù)據(jù)集;然后需要進行模型訓(xùn)練和參數(shù)調(diào)節(jié);通常需要花費較大的人力和物力。

方案三:使用本文的思路,即根據(jù)七段數(shù)碼管的知識識別LCD上的數(shù)字。 這種方法適用于識別LCD屏幕上的數(shù)字,當(dāng)然通過合理的擴展,也可以用來識別LCD上面的文字;該算法不僅具有較快的識別速度,而且可以取得較高的識別精度。

三、識別LCD屏幕上面的數(shù)字的原理詳解

  在現(xiàn)實生活中,我們經(jīng)常會看到各種各樣的LCD屏幕,小到我們的MP3,大到廣場中的電視等,隨著各種應(yīng)用的不斷出現(xiàn),LCD屏幕頻繁的出現(xiàn)在我們現(xiàn)實生活中的多個場景中,而快速、準(zhǔn)確的識別出LCD上面的數(shù)字就成為了一個新的剛需,這樣可以極大的節(jié)約人力和物力成本,下面將對LCD屏幕數(shù)字識別的原理進行說明,知其然不許知其所以然。

在這里插入圖片描述

上圖展示的是一個七段數(shù)碼管我們常見的LCD屏幕其實就是通過七段數(shù)碼管組合而成的,因而了解它的構(gòu)成至關(guān)重要。通過上圖我們可以觀察到這個數(shù)碼管中含有7段,并用0-6分別標(biāo)出,其實還有一個小數(shù)點表示8,這些段下面都有相應(yīng)的led燈,當(dāng)我們需要顯示不同的數(shù)字時只需要點亮不同段的LED燈即可,這個原理是不是很簡單!通過組合不同段,我們可以獲得128種組合(即2的7次方),具體的組合結(jié)果如下圖所示,對于這128種組合而言,我們只對其中的0-9這10個數(shù)字比較感興趣,其它的組合并不是我們關(guān)注的目標(biāo)。

在這里插入圖片描述

在這里插入圖片描述

即,我們只對0-9這10個數(shù)字的組合比較感興趣,這其實就是我們常用的數(shù)字,我們可以通過它們組合成任意一個數(shù)字?。?!通過上圖我們可以觀察到當(dāng)我們點亮特定段的LED等之后,LCD就能顯示出特定的數(shù)字,那么我們可不可以通過判斷不同段的特征來判斷當(dāng)前的數(shù)字呢,這其實就是本文的實現(xiàn)思路?。?!

四、算法實現(xiàn)步驟

  為了完成LCD上面的數(shù)字識別,我們需要按照如下的步驟進行實現(xiàn)該算法。

  • 步驟1-定位面板上面的LCD的位置。由于LCD屏幕和面板具有較大的亮度差異,我們可以使用邊緣檢測算法獲得LCD的位置。
  • 步驟2-獲取LCD屏幕。通過上一步我們可以獲得一個邊緣map;接著我們需要在這個邊緣map中尋找輪廓;最后最大的矩形區(qū)域即是我們需要的LCD。
  • 步驟3-定位LCD上面的數(shù)字。在獲取到LCD之后,我們感興趣的是LCD上面的數(shù)字,那么我們就需要對這些數(shù)字進行定位,即輸出它們的位置信息。由于LCD上面的數(shù)字和周圍的區(qū)域之間具有較大的差異,因而使用閾值和形態(tài)學(xué)操作就可以很好的完成這個任務(wù)。
  • 步驟4-進行數(shù)字識別。在獲取到數(shù)字的位置信息后,我們將使用opencv中內(nèi)置的算法對這些數(shù)字進行識別,從而獲得我們需要的結(jié)果。

五、算法代碼實現(xiàn)

# coding=utf-8
# 導(dǎo)入一些python包
from imutils.perspective import four_point_transform
from imutils import contours
import imutils
import cv2

# 定義每一個數(shù)字對應(yīng)的字段
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.imread("example.jpg")

# 將輸入圖片裁剪到固定大小
image = imutils.resize(image, height=500)
# 將輸入轉(zhuǎn)換為灰度圖片
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 進行高斯模糊操作
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 執(zhí)行邊緣檢測
edged = cv2.Canny(blurred, 50, 200, 255)
cv2.imwrite('edge.png', edged)

# 在邊緣檢測map中發(fā)現(xiàn)輪廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
# 根據(jù)大小對這些輪廓進行排序
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
displayCnt = None

# 循環(huán)遍歷所有的輪廓
for c in cnts:
	# 對輪廓進行近似
	peri = cv2.arcLength(c, True)
	approx = cv2.approxPolyDP(c, 0.02 * peri, True)

	# 如果當(dāng)前的輪廓有4個頂點,我們返回這個結(jié)果,即LCD所在的位置
	if len(approx) == 4:
		displayCnt = approx
		break

# 應(yīng)用視角變換到LCD屏幕上
warped = four_point_transform(gray, displayCnt.reshape(4, 2))
cv2.imwrite('warped.png', warped)
output = four_point_transform(image, displayCnt.reshape(4, 2))

# 使用閾值進行二值化
thresh = cv2.threshold(warped, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cv2.imwrite('thresh1.png', thresh)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1, 5))
# 使用形態(tài)學(xué)操作進行處理
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
cv2.imwrite('thresh2.png', thresh)

# 在閾值圖像中查找輪廓,然后初始化數(shù)字輪廓列表
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
digitCnts = []

# 循環(huán)遍歷所有的候選區(qū)域
for c in cnts:
	# 計算輪廓的邊界框
	(x, y, w, h) = cv2.boundingRect(c)

	# 如果當(dāng)前的這個輪廓區(qū)域足夠大,它一定是一個數(shù)字區(qū)域
	if w >= 15 and (h >= 30 and h <= 40):
		digitCnts.append(c)

# 從左到右對這些輪廓進行排序
digitCnts = contours.sort_contours(digitCnts, method="left-to-right")[0]
digits = []

# 循環(huán)處理每一個數(shù)字
i = 0
for c in digitCnts:
	# 獲取ROI區(qū)域
	(x, y, w, h) = cv2.boundingRect(c)
	roi = thresh[y:y + h, x:x + w]

	# 分別計算每一段的寬度和高度
	(roiH, roiW) = roi.shape
	(dW, dH) = (int(roiW * 0.25), int(roiH * 0.15))
	dHC = int(roiH * 0.05)

	# 定義一個7段數(shù)碼管的集合
	segments = [
		((0, 0), (w, dH)),	             # 上
		((0, 0), (dW, h // 2)),           # 左上
		((w - dW, 0), (w, h // 2)),	         # 右上
		((0, (h // 2) - dHC) , (w, (h // 2) + dHC)), # 中間
		((0, h // 2), (dW, h)),	           # 左下
		((w - dW, h // 2), (w, h)),	         # 右下
		((0, h - dH), (w, h))	           # 下
	]
	on = [0] * len(segments)

	# 循環(huán)遍歷數(shù)碼管中的每一段
	for (i, ((xA, yA), (xB, yB))) in enumerate(segments): # 檢測分割后的ROI區(qū)域,并統(tǒng)計分割圖中的閾值像素點
		segROI = roi[yA:yB, xA:xB]
		total = cv2.countNonZero(segROI)
		area = (xB - xA) * (yB - yA)

		# 如果非零區(qū)域的個數(shù)大于整個區(qū)域的一半,則認為該段是亮的
		if total / float(area) > 0.5:
			on[i]= 1

	# 進行數(shù)字查詢并顯示結(jié)果
	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)

# 顯示最終的輸出結(jié)果
print(u"{}{}.{} \u00b0C".format(*digits))
cv2.imshow("Input", image)
cv2.imshow("Output", output)
cv2.waitKey(0)

六、效果展示和分析

在這里插入圖片描述

 上圖展示了該算法的運行結(jié)果和一些中間結(jié)果。第1行第1列表示的是原始的輸入圖片,它和代碼中的image對應(yīng),我們需要識別的是LCD面板上面的34.5;第1行第2列表示的是Canny邊緣檢測算法的檢測結(jié)果,它對應(yīng)于代碼中的edged,通過該圖我們可以發(fā)現(xiàn)Canny邊緣檢測的結(jié)果中含有我們感興趣的目標(biāo),即中間的LCD;第1行第3列表示的是對輸入的灰度圖片應(yīng)用視角變換后的結(jié)果,即獲得了LCD屏幕所在的位置,它和代碼中的warped相互對應(yīng);第2行第1列表示的是對獲取到的LCD屏幕進行二值化后的結(jié)果,它和代碼中的thresh 相互對應(yīng),由于LCD上面的數(shù)字和背景之間具有較大的差異,因而通過簡單的二值化我們就可以獲得我們感興趣的目標(biāo)-數(shù)字;第2行第2列表示的是對二值化結(jié)果進行形態(tài)學(xué)操作之后的結(jié)果,它和代碼中的thresh 相互對應(yīng),我們可以發(fā)現(xiàn)執(zhí)行了形態(tài)學(xué)操作之后的結(jié)果更多平滑,同時過濾掉很多的噪聲,有利于后續(xù)的識別。

在這里插入圖片描述

  上圖展示了本算法獲取到的LCD屏幕中的數(shù)字,通過上圖我們可以發(fā)現(xiàn)該算法準(zhǔn)確的獲得了這些數(shù)字的位置信息,有利于后續(xù)的識別操作。

在這里插入圖片描述

  上圖展示了算法進行數(shù)字識別的實現(xiàn)細節(jié)。即通過遍歷每一個數(shù)字中的7個段,并統(tǒng)計該段中非零像素的個數(shù),當(dāng)其統(tǒng)計值大于整個區(qū)域的一半時,認為該段是亮的,當(dāng)統(tǒng)計完所有的這7個段之后,在預(yù)定義的數(shù)字詞典中進行查找,并輸出最終的結(jié)果即可。

在這里插入圖片描述

  上圖展示了算法最終的輸出結(jié)果,我們可以觀察到算法快速、準(zhǔn)確的獲得了我們需要的結(jié)果,滿足了我們的預(yù)期。

七、問題擴展與延伸

  通過上面的解析你可能已經(jīng)知道了如何來很好的解決上面這個問題。細心的你也許會發(fā)現(xiàn)上述結(jié)果中輸出的點號是人為添加上去的,并不是算法自動獲取的,而在現(xiàn)實場景中我們經(jīng)常會遇到小數(shù)點,比如溫度、濕度等,那么我的問題來啦,如何利用算法自動獲取圖中的小數(shù)點,使得算法最終自動輸出34.5的結(jié)果呢,這個問題留給聰明的你進行思考吧?。。。ㄆ鋵崝?shù)碼管是有八段的,第八段就是小數(shù)點的?。。。?/p>

參考資料

1、參考鏈接1

到此這篇關(guān)于Python+Opencv實現(xiàn)數(shù)字識別的示例代碼的文章就介紹到這了,更多相關(guān)Opencv 數(shù)字識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Python中的Dict(下篇)

    詳解Python中的Dict(下篇)

    這篇文章主要為大家介紹了Python中的Dict,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python編程中非常重要卻又被嚴(yán)重低估的庫decorator

    Python編程中非常重要卻又被嚴(yán)重低估的庫decorator

    今天介紹的是一個已經(jīng)存在十年,但是依舊不紅的庫 decorator,好像很少有人知道他的存在一樣。本篇文章不會過多的向你介紹裝飾器的基本知識,我會默認你知道什么是裝飾器,并且懂得如何寫一個簡單的裝飾器
    2021-10-10
  • 使用Python操作MySQL的小技巧

    使用Python操作MySQL的小技巧

    這篇文章主要介紹了使用Python操作MySQL的小技巧,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • Python讀取csv、Excel文件生成圖表的方法

    Python讀取csv、Excel文件生成圖表的方法

    這篇文章主要介紹了Python讀取csv、Excel文件生成圖表,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Python數(shù)據(jù)可視化實踐之使用Matplotlib繪制圖表

    Python數(shù)據(jù)可視化實踐之使用Matplotlib繪制圖表

    數(shù)據(jù)可視化是數(shù)據(jù)分析的重要環(huán)節(jié),通過將數(shù)據(jù)轉(zhuǎn)化為圖形,可以更直觀地展示數(shù)據(jù)特征和規(guī)律。Python中的Matplotlib庫是一個強大的數(shù)據(jù)可視化工具,本文將帶您了解Matplotlib的基本使用方法,以及如何繪制常見的圖表
    2023-05-05
  • tensorflow實現(xiàn)讀取模型中保存的值 tf.train.NewCheckpointReader

    tensorflow實現(xiàn)讀取模型中保存的值 tf.train.NewCheckpointReader

    今天小編就為大家分享一篇tensorflow實現(xiàn)讀取模型中保存的值 tf.train.NewCheckpointReader,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python中的字典及其使用方法

    Python中的字典及其使用方法

    這篇文章主要介紹了Python中的字典及其使用方法,包括使用字典(添加、刪除、修改等操作)、遍歷字典以及字典與列表之間的嵌套使用具有一定的參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • Python實現(xiàn)檢測文件的MD5值來查找重復(fù)文件案例

    Python實現(xiàn)檢測文件的MD5值來查找重復(fù)文件案例

    這篇文章主要介紹了Python實現(xiàn)檢測文件的MD5值來查找重復(fù)文件案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 跟老齊學(xué)Python之模塊的加載

    跟老齊學(xué)Python之模塊的加載

    這篇文章主要介紹了跟老齊學(xué)Python之模塊的加載,需要的朋友可以參考下
    2014-10-10
  • 詳解Python的Django框架中的Cookie相關(guān)處理

    詳解Python的Django框架中的Cookie相關(guān)處理

    這篇文章主要介紹了詳解Python的Django框架中的Cookie相關(guān)處理,Cookie存儲是每個開發(fā)框架都會著重注意的重要功能,需要的朋友可以參考下
    2015-07-07

最新評論