好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 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的結果呢,這個問題留給聰明的你進行思考吧!!!(其實數碼管是有八段的,第八段就是小數點的!!!)

參考資料

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實現數字識別的示例代碼的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 日本黄页网站在线观看| 在闺房里被强高h| 最新亚洲精品国自产在线观看 | 49图库| JLZZ性欧美100| 国产成人精品午夜福利200| 很黄很污小说| 91性视频| 与父同行在线观看| 韩国19禁主播韩宝贝在线观看| 王语嫣含精肉臀迎合娇吟视频| HEZYO国产精品无码视频 | 花季传媒网站免费进入在线观看 | av女优电影网| 欧美虐肛| 成人免费福利视频| 乖趴好灌浓精h1v1顾霆琛| 国产精品达达兔影院在线| 美女扒开嫩嫩的尿囗让人桶出白浆| 网站免费黄色| 亚洲国产精品第一区二区| 麻豆制片厂制作传媒网站在线| 筱惠欲乱美女全文免费全文| 被黑人抽搐翻白眼晕过去的句子| 国产精品亚洲综合久久| 一级a免一级a做免费线看内裤| 中文字幕乱码亚洲精品一区| 免费?无码?国产免费软件| 911国精产品自偷自偷综合| 国产自精品在线| 国产91观看| 性视频在线看| 毛茸茸的撤尿偷窥XXXX| 女同亚洲精品一区二区三| 黑人持续中出ntr| 嫁给豪门老男人千峰一鹤| 午夜影院h| 亚洲精品岁国产精品| 亚洲毛片偷拍精品一区二区三区| 性色蜜月aV一区二区三区小说| 台湾少妇2做爰伦理|