婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Python+Opencv實現數字識別的示例代碼

Python+Opencv實現數字識別的示例代碼

熱門標簽:n400電話申請多少錢 ai地圖標注 廈門crm外呼系統如何 百應ai電銷機器人鄭州 西藏快速地圖標注地點 長春人工智能電銷機器人官網 如何在地圖標注文字 地圖標注推廣單頁 女王谷地圖標注

一、什么是數字識別?

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


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

二、如何實現數字識別?

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

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

方案二:使用深度神經網絡。 隨著深度學習技術的快速發展,神經網絡被引入到計算機視覺當中的多個領域中,對于數字識別這個簡單的任務而言,神經網絡可以獲得準確的識別結果,比較有名的是mnist數據集。但是這種方法首先需要用戶收集大量的數據集;然后需要進行模型訓練和參數調節;通常需要花費較大的人力和物力。

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

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

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


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



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

四、算法實現步驟

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

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

五、算法代碼實現

# coding=utf-8
# 導入一些python包
from imutils.perspective import four_point_transform
from imutils import contours
import imutils
import 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.imread("example.jpg")

# 將輸入圖片裁剪到固定大小
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)
cv2.imwrite('edge.png', edged)

# 在邊緣檢測map中發現輪廓
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

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

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

# 應用視角變換到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))
# 使用形態學操作進行處理
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
cv2.imwrite('thresh2.png', thresh)

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

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

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

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

# 循環處理每一個數字
i = 0
for c in digitCnts:
	# 獲取ROI區域
	(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段數碼管的集合
	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)

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

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

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

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

六、效果展示和分析

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


  上圖展示了本算法獲取到的LCD屏幕中的數字,通過上圖我們可以發現該算法準確的獲得了這些數字的位置信息,有利于后續的識別操作。


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


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

七、問題擴展與延伸

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

參考資料

1、參考鏈接1

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

您可能感興趣的文章:
  • 詳解Python OpenCV數字識別案例
  • python opencv人臉識別考勤系統的完整源碼
  • Python基于Opencv識別兩張相似圖片
  • python基于OpenCV模板匹配識別圖片中的數字
  • Python OpenCV招商銀行信用卡卡號識別的方法
  • Opencv+Python識別PCB板圖片的步驟
  • python基于opencv實現人臉識別
  • python+opencv實現文字顏色識別與標定功能

標簽:亳州 渭南 拉薩 黔東 興安盟 內江 綿陽 廊坊

巨人網絡通訊聲明:本文標題《Python+Opencv實現數字識別的示例代碼》,本文關鍵詞  Python+Opencv,實現,數字,識,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python+Opencv實現數字識別的示例代碼》相關的同類信息!
  • 本頁收集關于Python+Opencv實現數字識別的示例代碼的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产suv精品一区二区三区| 99精品热视频| 久久久激情视频| 综合久久给合久久狠狠狠97色| 一本色道久久加勒比精品| 免费欧美日韩国产三级电影| 欧美丰满嫩嫩电影| 91免费看`日韩一区二区| 视频一区在线视频| 国产精品久久久久久久浪潮网站| 欧美日韩国产综合一区二区三区| 国产成人夜色高潮福利影视| 日韩成人av影视| 色域天天综合网| 国产成人精品影院| caoporm超碰国产精品| 99这里只有精品| 在线观看日韩精品| 在线亚洲高清视频| 5858s免费视频成人| 欧美一区二区在线免费播放| 欧美videofree性高清杂交| 2021久久国产精品不只是精品| 欧美成人官网二区| 国产亚洲精品7777| 亚洲欧洲韩国日本视频| 一区二区三区蜜桃| 久久机这里只有精品| 国产精品99久久久久久久vr| 狠狠色狠狠色综合| 美女视频黄a大片欧美| 久久av中文字幕片| 国产精品123区| 91激情五月电影| 精品国产一区久久| 欧美国产日韩a欧美在线观看| 国产精品毛片久久久久久久| 亚洲第一狼人社区| 国产成人在线影院| 欧美人狂配大交3d怪物一区| 久久久久9999亚洲精品| 亚洲午夜在线观看视频在线| 黑人巨大精品欧美一区| 在线观看亚洲成人| 国产丝袜美腿一区二区三区| 午夜视频久久久久久| 成人av网址在线| 精品久久久久久久人人人人传媒 | 亚洲 欧美综合在线网络| 色94色欧美sute亚洲线路二| 2020国产精品| 日韩电影免费在线观看网站| 粉嫩蜜臀av国产精品网站| 6080国产精品一区二区| 亚洲精品一二三| 成人综合在线观看| 精品成人私密视频| 午夜私人影院久久久久| 色综合久久精品| 中文字幕制服丝袜成人av| 国产福利91精品一区| 日韩欧美激情一区| 日本麻豆一区二区三区视频| 欧美亚洲愉拍一区二区| 日韩毛片视频在线看| 99久久伊人久久99| 国产精品乱码一区二区三区软件| 日韩高清在线观看| 国产精品电影一区二区三区| 石原莉奈在线亚洲三区| 欧美视频一区二区三区在线观看| 亚洲码国产岛国毛片在线| 色综合网色综合| 一区二区三区国产| 欧美图片一区二区三区| 五月激情六月综合| 91精品国产欧美一区二区成人 | 国产成人综合亚洲网站| 中文幕一区二区三区久久蜜桃| 国产福利一区二区三区视频| 1000部国产精品成人观看| 91在线视频在线| 手机精品视频在线观看| 26uuu色噜噜精品一区二区| 日韩精品一区二区三区老鸭窝| 久久se这里有精品| 国产精品久久久久久久久免费相片 | 91色porny| 亚洲成人高清在线| 日韩欧美一级二级| 91污在线观看| 奇米亚洲午夜久久精品| 中文字幕一区二区三区在线观看 | 亚洲成av人综合在线观看| 精品国产一区二区三区四区四 | 精品一区二区三区日韩| 国产欧美日韩在线看| 欧美三级资源在线| 精东粉嫩av免费一区二区三区| 中文字幕在线免费不卡| 欧美xxxxx牲另类人与| 日本韩国欧美一区| 国产激情一区二区三区| 日韩二区三区四区| 一区二区视频免费在线观看| 久久精品综合网| 欧美成人精品高清在线播放| 在线精品视频免费观看| av在线不卡观看免费观看| 亚洲国产精品嫩草影院| 亚洲欧美日韩国产另类专区| 国产日韩三级在线| 久久人人97超碰com| 在线不卡的av| 91麻豆精品国产| 亚洲制服丝袜av| 亚洲人成网站在线| 国产精品久久久久aaaa| 久久先锋影音av鲁色资源| 日韩亚洲电影在线| 欧美精品三级在线观看| 欧美亚洲国产一区二区三区va| 91亚洲精品久久久蜜桃网站| 国产成a人亚洲精品| 成人性生交大片免费看在线播放| 国产不卡视频在线观看| 成人动漫在线一区| 色综合久久99| 欧美精品777| 欧美岛国在线观看| 日韩欧美一区中文| 蜜乳av一区二区三区| 精品1区2区在线观看| 精品91自产拍在线观看一区| 久久综合九色综合97婷婷| 欧美激情一区二区在线| 亚洲精品视频在线| 三级成人在线视频| 国产一区二区三区免费观看| 成人免费看黄yyy456| 色综合久久综合| 日韩免费电影网站| 久久久久久久久97黄色工厂| 亚洲人成网站影音先锋播放| 日韩av一区二区在线影视| 国产91在线看| 宅男噜噜噜66一区二区66| 久久丝袜美腿综合| 一区二区三区四区中文字幕| 日本欧美加勒比视频| 成人国产精品免费观看动漫| 欧美日韩黄色一区二区| 中文字幕在线不卡| 精品无码三级在线观看视频| 色婷婷综合中文久久一本| 欧美电影免费观看高清完整版| 国产香蕉久久精品综合网| 日韩中文字幕麻豆| 色香色香欲天天天影视综合网| 欧美成人艳星乳罩| 性做久久久久久久久| 99久久精品国产毛片| 欧美精品一区二区在线观看| 亚洲国产成人91porn| 不卡视频在线观看| 久久久久久久久99精品| 久久福利资源站| 欧美在线观看视频一区二区三区| 日韩亚洲电影在线| 亚洲午夜精品网| 91在线视频免费观看| 中文字幕av资源一区| 国产精品自在在线| 久久久久久97三级| 国产91丝袜在线观看| 国产精品午夜在线观看| 国产麻豆精品在线观看| 精品国产91乱码一区二区三区| 天天操天天色综合| 3d动漫精品啪啪一区二区竹菊| 亚洲h精品动漫在线观看| 欧美日韩精品一区二区天天拍小说| 亚洲精品免费播放| 色婷婷av一区| 亚洲国产成人高清精品| 欧美日韩一区二区三区高清 | 色综合久久久久久久久| 中文字幕精品—区二区四季| 国产成人亚洲精品青草天美| 中文字幕在线观看一区二区| 色婷婷激情久久| 丝袜脚交一区二区| 日韩欧美aaaaaa| 成人免费av在线| 日韩va欧美va亚洲va久久| 26uuu色噜噜精品一区二区| 成人美女视频在线看| 亚洲图片一区二区| 亚洲精品在线免费观看视频| 91老师片黄在线观看|