日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Python OpenCV數字識別案例

瀏覽:22日期:2022-06-18 18:36:51
目錄前言一、案例介紹二、步驟1、模板讀入,以及一些包的導入,函數定義等2、模板預處理,將模板數字分開,并排序3、輸入圖像預處理,將圖像中的數字部分提取出來4、模板匹配總結前言

實踐是檢驗真理的唯一標準。

因為覺得一板一眼地學習OpenCV太過枯燥,于是在網上找了一個以項目為導向的教程學習。話不多說,動手做起來。

一、案例介紹

提供信用卡上的數字模板:

詳解Python OpenCV數字識別案例

要求:識別出信用卡上的數字,并將其直接打印在原圖片上。雖然看起來很蠢,但既然可以將數字打印在圖片上,說明已經成功識別數字,因此也可以將其轉換為數字文本保存。車牌號識別等項目的思路與此案例類似。

示例:

詳解Python OpenCV數字識別案例

原圖

詳解Python OpenCV數字識別案例

處理后的圖

二、步驟

大致分為如下幾個步驟:

1.模板讀入

2.模板預處理,將模板數字分開,并排序

3.輸入圖像預處理,將圖像中的數字部分提取出來

4.將數字與模板數字進行匹配,匹配率最高的即為對應數字。

1、模板讀入,以及一些包的導入,函數定義等

import cv2 as cvimport numpy as npimport myutilsdef cv_show(name, img):# 自定義的展示函數 cv.imshow(name, img) cv.waitKey(0)# 讀入模板圖n = ’text’img = cv.imread('images/ocr_a_reference.png')# cv_show(n, template)# 自定義的展示函數,方便顯示圖片2、模板預處理,將模板數字分開,并排序

詳解Python OpenCV數字識別案例

模板的預處理順序:灰度圖,二值化,再進行輪廓檢測。需要注意的是openCV檢測輪廓時是檢測白色邊框,因此要將模板圖的數字二值化變為白色。

詳解Python OpenCV數字識別案例

# 模板轉換為灰度圖ref = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# cv_show(n, ref)# 轉換為二值圖,把數字部分變為白色ref = cv.threshold(ref, 10, 255, cv.THRESH_BINARY_INV)[1] # 騷寫法,函數多個返回值為元組,這里取第二個返回值cv_show(n, ref)# 對模板進行輪廓檢測,得到輪廓信息refCnts, hierarchy = cv.findContours(ref.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)cv.drawContours(img, refCnts, -1, (0, 0, 255), 2) # 第一個參數為目標圖像# cv_show(n, img)

詳解Python OpenCV數字識別案例

紅色部分即為檢測出的輪廓。

接下來進行輪廓排序,因為檢測出的輪廓是無序的,因此要按照輪廓的左上角點的x坐標來排序。輪廓排序后按順序放入字典,則字典中的鍵值對是正確匹配的,如‘0’對應輪廓0 ,‘1’對應輪廓1。

# 輪廓排序refCnts = myutils.sort_contours(refCnts)[0]digits = {}# 單個輪廓提取到字典中for (i, c) in enumerate(refCnts): (x, y, w, h) = cv.boundingRect(c) roi = ref[y:y + h, x:x + w] # 在模板中復制出輪廓 roi = cv.resize(roi, (57, 88)) # 改成相同大小的輪廓 digits[i] = roi # 此時字典鍵對應的輪廓即為對應數字。如鍵‘1’對應輪廓‘1’

至此,模板圖處理完畢。

3、輸入圖像預處理,將圖像中的數字部分提取出來

詳解Python OpenCV數字識別案例

在此步驟中需要將信用卡上的每個數字提取出來,并與上一步得到的模板一一匹配。首先初始化卷積核,方便之后tophat操作以及閉運算操作使用。

# 初始化卷積核rectKernel = cv.getStructuringElement(cv.MORPH_RECT, (9, 3))sqKernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))

接下來讀入圖片,調整圖片大小,轉換為灰度圖。

# 待分析圖片讀入,預處理card_image = cv.imread('images/credit_card_01.png')# cv_show(’a’, card_image)card_image = myutils.resize(card_image, width=300) # 更改圖片大小gray = cv.cvtColor(card_image, cv.COLOR_BGR2GRAY)# cv_show(’gray’, gray)

詳解Python OpenCV數字識別案例

然后進行tophat操作,tophat可以突出圖片中明亮的區域,過濾掉較暗的部分:

tophat = cv.morphologyEx(gray, cv.MORPH_TOPHAT, rectKernel)# cv_show(’tophat’, tophat)

詳解Python OpenCV數字識別案例

再通過sobel算子檢測邊緣,進行一次閉操作,二值化,再進行一次閉操作,填補空洞。

# x方向的Sobel算子gradX = cv.Sobel(tophat, cv.CV_32F, 1, 0, ksize=3) gradX = np.absolute(gradX) # absolute: 計算絕對值min_Val, max_val = np.min(gradX), np.max(gradX)gradX = (255 * (gradX - min_Val) / (max_val - min_Val))gradX = gradX.astype('uint8')# 通過閉操作(先膨脹,再腐蝕)將數字連在一起. 將本是4個數字的4個框膨脹成1個框,就腐蝕不掉了gradX = cv.morphologyEx(gradX, cv.MORPH_CLOSE, rectKernel)# cv_show(’close1’, gradX)# 二值化thresh = cv.threshold(gradX, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)[1]# 閉操作,填補空洞thresh = cv.morphologyEx(thresh, cv.MORPH_CLOSE, sqKernel)# cv_show(’close2’, thresh)

詳解Python OpenCV數字識別案例

之后就可以查找輪廓了。

threshCnts = cv.findContours(thresh.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)[0]card_copy = card_image.copy()cv.drawContours(card_copy, threshCnts, -1, (0, 0, 255), 2)cv_show(’Input_Contours’, card_copy)

詳解Python OpenCV數字識別案例

4、模板匹配

將模板數字和待識別的圖片都處理好后,就可以進行匹配了。

locs = [] # 存符合條件的輪廓for i, c in enumerate(threshCnts): # 計算矩形 x, y, w, h = cv.boundingRect(c) ar = w / float(h) # 選擇合適的區域,根據實際任務來,這里的基本都是四個數字一組 if 2.5 < ar < 4.0:if (40 < w < 55) and (10 < h < 20): # 符合的留下來 locs.append((x, y, w, h))# 將符合的輪廓從左到右排序locs = sorted(locs, key=lambda x: x[0])

接下來,遍歷每一個大輪廓,每個大輪廓中有四個數字,對應四個小輪廓。將小輪廓與模板匹配。

output = [] # 存正確的數字for (i, (gx, gy, gw, gh)) in enumerate(locs): # 遍歷每一組大輪廓(包含4個數字) groupOutput = [] # 根據坐標提取每一個組(4個值) group = gray[gy - 5:gy + gh + 5, gx - 5:gx + gw + 5] # 往外擴一點 # cv_show(’group_’ + str(i), group) # 預處理 group = cv.threshold(group, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)[1] # 二值化的group # cv_show(’group_’+str(i),group) # 計算每一組的輪廓 這樣就分成4個小輪廓了 digitCnts = cv.findContours(group.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)[0] # 排序 digitCnts = myutils.sort_contours(digitCnts, method='left-to-right')[0]# 計算并匹配每一組中的每一個數值 for c in digitCnts: # c表示每個小輪廓的終點坐標z = 0# 找到當前數值的輪廓,resize成合適的的大小(x, y, w, h) = cv.boundingRect(c) # 外接矩形roi = group[y:y + h, x:x + w] # 在原圖中取出小輪廓覆蓋區域,即數字roi = cv.resize(roi, (57, 88))# cv_show('roi_'+str(z),roi)# 計算匹配得分: 0得分多少,1得分多少...scores = [] # 單次循環中,scores存的是一個數值 匹配 10個模板數值的最大得分# 在模板中計算每一個得分# digits的digit正好是數值0,1,...,9;digitROI是每個數值的特征表示for (digit, digitROI) in digits.items(): # 進行模板匹配, res是結果矩陣 res = cv.matchTemplate(roi, digitROI, cv.TM_CCOEFF) # 此時roi是X digitROI是0 依次是1,2.. 匹配10次,看模板最高得分多少 Max_score = cv.minMaxLoc(res)[1] # 返回4個,取第二個最大值Maxscore scores.append(Max_score) # 10個最大值# print('scores:',scores)# 得到最合適的數字groupOutput.append(str(np.argmax(scores))) # 返回的是輸入列表中最大值的位置z = z + 1# 畫出來 cv.rectangle(card_image, (gx - 5, gy - 5), (gx + gw + 5, gy + gh + 5), (0, 0, 255), 1) # 左上角,右下角# putText參數:圖片,添加的文字,左上角坐標,字體,字體大小,顏色,字體粗細 cv.putText(card_image, ''.join(groupOutput), (gx, gy - 15), cv.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)

最后將其打印出來,任務就完成了。

cv.imshow('Output_image_'+str(i), card_image)cv.waitKey(0)

詳解Python OpenCV數字識別案例

總結

信用卡識別的案例用到了圖像處理的一些基本操作,對剛上手CV的人來說還是比較友好的。

以上就是詳解Python OpenCV數字識別案例的詳細內容,更多關于Python OpenCV數字識別案例的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产亚洲精品久久久久婷婷瑜伽| 午夜欧美视频| 欧美亚洲网站| 精品一区二区三区中文字幕视频 | 成人在线视频中文字幕| 亚洲伊人av| 午夜欧美视频| 国产免费久久| 久久国产免费| 日韩有吗在线观看| 国产成人免费| 国产视频一区三区| 久久一区精品| 亚洲欧美视频| 麻豆国产91在线播放| 女人av一区| 国产亚洲人成a在线v网站| 亚洲性色av| 日韩精品中文字幕一区二区| 亚洲天堂资源| 日韩精品亚洲专区在线观看| 天堂中文在线播放| 婷婷亚洲成人| 欧美aa在线观看| 日韩国产欧美在线播放| 成人精品视频| 亚洲影院天堂中文av色| 国产资源在线观看入口av| 麻豆9191精品国产| 日韩.com| 日韩精品视频网站| 久久麻豆精品| 国产精品成人3p一区二区三区| 91成人精品| 电影91久久久| 日韩av网站在线观看| 久久九九精品| 国产精品毛片视频| 亚洲深爱激情| 国产亚洲一区二区三区不卡| 久久精品72免费观看| 国产一区二区三区视频在线| 亚洲午夜在线| 日韩精品成人| 日韩免费高清| 中文字幕av一区二区三区四区| 国产精品免费精品自在线观看| 日韩欧美一区二区三区在线视频| 亚洲免费中文| 麻豆国产91在线播放| 99视频精品全部免费在线视频| 中文字幕av一区二区三区四区| 久久超碰99| 婷婷亚洲五月| 国产精品久一| 在线日韩一区| 国产亚洲一区二区三区啪| 日韩精品中文字幕第1页| 在线精品亚洲| 日韩久久视频| 欧美亚洲国产日韩| 欧美日韩国产综合网| 国产精品天堂蜜av在线播放| 欧美.日韩.国产.一区.二区| 国产精品极品在线观看| 狠狠爱成人网| 国产91在线精品| 日韩欧美美女在线观看| 久久精品一区二区不卡| 国产精品白丝久久av网站| 99久久精品网站| 国产欧美日韩视频在线| 国产高清一区| av资源中文在线天堂| 91精品啪在线观看国产爱臀| 亚洲高清不卡| 久久只有精品| 亚洲制服欧美另类| 亚洲欧美综合| 黄色在线网站噜噜噜| 日本久久一区| 免费日韩一区二区| 日韩成人亚洲| 麻豆精品国产91久久久久久| 少妇精品久久久一区二区三区| 蜜桃av.网站在线观看| 青草综合视频| 国产精品美女久久久浪潮软件| 98精品视频| 久久不卡日韩美女| 欧美日韩1区2区3区| 三级欧美在线一区| 欧美精品一区二区久久| 成人福利视频| 精品一区二区三区中文字幕 | 视频一区在线视频| 久久精品电影| 国产精品99一区二区三区| 国产日韩欧美三区| 蜜桃视频在线观看一区| 精品欧美激情在线观看| 日韩一区自拍| 激情综合婷婷| 久久av电影| 国产日韩欧美一区在线| 亚洲另类视频| 久久不射中文字幕| 亚洲一区二区三区高清| 欧美aa国产视频| 日韩视频网站在线观看| 精品国产一区二| 麻豆国产精品视频| 久久精品国产网站| 欧美激情视频一区二区三区免费| 日韩精品视频在线看| 自拍自偷一区二区三区| 免费美女久久99| 欧美网站在线| 欧美午夜不卡| 美女国产精品| 免费一区二区视频| 免费成人在线影院| 亚洲毛片在线免费| 日本不卡不码高清免费观看| 日韩高清三区| 国产亚洲精品美女久久| 欧美亚洲一级| 国产精品免费精品自在线观看| 国产精品不卡| 日韩伦理在线一区| 亚洲综合电影一区二区三区| 91精品国产自产精品男人的天堂 | 尤物网精品视频| 日韩在线麻豆| 免费观看亚洲天堂| 久久国产日本精品| 亚洲午夜免费| 成人免费一区| 免费久久99精品国产自在现线| 日韩在线网址| 麻豆成全视频免费观看在线看| 欧美日韩四区| 国产精品啊啊啊| 亚洲欧美网站在线观看| 欧美日一区二区在线观看| 久久久久亚洲精品中文字幕| 成人欧美一区二区三区的电影| 免费视频国产一区| 亚洲欧美网站在线观看| 1024精品一区二区三区| 国产一区白浆| 国产精品mv在线观看| 欧美日韩在线二区| 91成人在线| 日韩国产专区| 91麻豆精品激情在线观看最新| 日韩成人精品一区二区| 国产麻豆精品| 欧美精品影院| 国产传媒av在线| 国产精品毛片在线| 国产精品对白| 99国产精品一区二区| 亚洲久久一区| 久久精品一区| 婷婷成人基地| 国产午夜精品一区在线观看| 日韩不卡在线观看日韩不卡视频| 国内自拍视频一区二区三区| 日韩精品2区| 亚洲视频二区| 国内在线观看一区二区三区| 欧美不卡视频| 国产三级精品三级在线观看国产| 欧美少妇精品| 亚洲美女91| 国产精品99一区二区三区| 日韩一区二区三区四区五区| 国产精品天天看天天狠| 视频在线在亚洲| 秋霞影视一区二区三区| 欧美国产中文高清| 一区二区高清| 精品一区在线| 国产精品色婷婷在线观看| 国产精品毛片在线| 黄毛片在线观看| 国产图片一区| 免播放器亚洲一区| 亚洲福利专区| 国产一区二区三区日韩精品| 欧美综合精品| 久久国产精品99国产| 日韩天堂在线| 精品国产aⅴ| 国产丝袜一区| 亚洲日本久久| 国产精品女主播一区二区三区| 国产超碰精品| 麻豆国产91在线播放|