一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenCV:易上手的數字識別實踐案例

新機器視覺 ? 來源:新機器視覺 ? 作者:新機器視覺 ? 2021-03-29 13:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

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

1、案例介紹

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


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

示例:

原圖

處理后的圖

大致分為如下幾個步驟:

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、模板預處理,將模板數字分開,并排序

模板的預處理順序:灰度圖,二值化,再進行輪廓檢測。需要注意的是openCV檢測輪廓時是檢測白色邊框,因此要將模板圖的數字二值化變?yōu)榘咨?/p>

# 模板轉換為灰度圖ref = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# cv_show(n, ref) # 轉換為二值圖,把數字部分變?yōu)榘咨玶ef = 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

紅色部分即為檢測出的輪廓。接下來進行輪廓排序,因為檢測出的輪廓是無序的,因此要按照輪廓的左上角點的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、輸入圖像預處理,將圖像中的數字部分提取出來

在此步驟中需要將信用卡上的每個數字提取出來,并與上一步得到的模板一一匹配。首先初始化卷積核,方便之后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)

90a6ec1c-8e94-11eb-8b86-12bb97331649.png

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

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

90e34180-8e94-11eb-8b86-12bb97331649.png

再通過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)

9139d478-8e94-11eb-8b86-12bb97331649.png

之后就可以查找輪廓了。

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)

4、模板匹配

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

locs = [] # 存符合條件的輪廓for i, c in enumerate(threshCnts): # 計算矩形 x, y, w, h = cv.boundingRect(c) ar = w / float(h) # 選擇合適的區(qū)域,根據實際任務來,這里的基本都是四個數字一組 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] # 在原圖中取出小輪廓覆蓋區(qū)域,即數字 roi = cv.resize(roi, (57, 88)) # cv_show("roi_"+str(z),roi) # 計算匹配得分: 0得分多少,1得分多少... scores = [] # 單次循環(huán)中,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)

總結

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

責任編輯:lq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數字識別
    +關注

    關注

    2

    文章

    20

    瀏覽量

    10248
  • 圖像預處理
    +關注

    關注

    0

    文章

    9

    瀏覽量

    6361
  • OpenCV
    +關注

    關注

    32

    文章

    642

    瀏覽量

    42845

原文標題:OpenCV萌新福音:易上手的數字識別實踐案例

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于LockAI視覺識別模塊:C++人臉識別

    本文基于RV1106做成的LockAI視覺識別模塊,采用 LZ-Picodet 模型訓練的人臉檢測模型 LZ-Face,以及ArcFace人臉識別模型,實現(xiàn)人臉識別系統(tǒng)。 源代碼:https
    發(fā)表于 07-01 12:01

    基于LockAI視覺識別模塊:手寫數字識別

    手寫數字識別是一種經典的模式識別和圖像處理問題,旨在通過計算機自動識別用戶手寫的數字。 本文將教會你如何使用基于RV1106的 LockAI
    發(fā)表于 06-30 16:45

    基于LockAI視覺識別模塊:手寫數字識別

    手寫數字識別是一種經典的模式識別和圖像處理問題,旨在通過計算機自動識別用戶手寫的數字。本文將教會你如何使用基于RV1106的LockAI視覺
    的頭像 發(fā)表于 06-30 15:44 ?423次閱讀
    基于LockAI視覺<b class='flag-5'>識別</b>模塊:手寫<b class='flag-5'>數字</b><b class='flag-5'>識別</b>

    基于LockAI視覺識別模塊:C++條碼識別

    條碼識別是視覺模塊經常使用到的功能之一,經常用于識別超市的貨物信息。本文我們將演示如何基于瑞芯微RV1106的LockAI視覺識別進行條碼識別。 源代碼網址:https://gitee
    發(fā)表于 05-27 10:26

    基于LockAI視覺識別模塊:C++圖像采集例程

    本文主要演示如何使用LockAI視覺識別模塊進行視頻流的讀取,同時使用Edit模塊進行圖像傳輸?;A知識講解1.1OpenCV簡介OpenCV(OpenSourceComputerVisionLibra
    的頭像 發(fā)表于 04-30 18:23 ?214次閱讀
    基于LockAI視覺<b class='flag-5'>識別</b>模塊:C++圖像采集例程

    EMC電機控制器測試整改:從問題識別到優(yōu)化實踐

    深圳南柯電子|EMC電機控制器測試整改:從問題識別到優(yōu)化實踐
    的頭像 發(fā)表于 03-20 09:34 ?418次閱讀
    EMC電機控制器測試整改:從問題<b class='flag-5'>識別</b>到優(yōu)化<b class='flag-5'>實踐</b>

    華錄數據要素創(chuàng)新實踐獲認可

    近日,華錄陸續(xù)收到來自內蒙古數據交易中心、鎮(zhèn)江市人社局檔案中心、遂寧市政務服務和數據局、陽泉領航科技公司的感謝信,信中對華錄各項目團隊開展的數據要素市場建設、數據資產入表、行業(yè)數字化及數據資源管理等工作表示認可和感謝!
    的頭像 發(fā)表于 01-17 10:44 ?538次閱讀

    【實戰(zhàn)】人工智能0基礎入門:基于Python+OpenCV的車牌識別項目(課程+平臺實踐

    01引言隨著智能交通系統(tǒng)的發(fā)展,車牌識別技術在車輛管理、交通監(jiān)控、停車收費等多個領域發(fā)揮著重要作用。接下來小編將帶你深入了解車牌識別項目的全流程,從理論基礎到實際應用,讓你掌握如何構建一個高效、準確
    的頭像 發(fā)表于 12-16 10:43 ?830次閱讀
    【實戰(zhàn)】人工智能0基礎入門:基于Python+<b class='flag-5'>OpenCV</b>的車牌<b class='flag-5'>識別</b>項目(課程+平臺<b class='flag-5'>實踐</b>)

    如何用OpenCV進行手勢識別--基于米爾全志T527開發(fā)板

    本文將介紹基于米爾電子MYD-LT527開發(fā)板(米爾基于全志T527開發(fā)板)的OpenCV手勢識別方案測試。摘自優(yōu)秀創(chuàng)作者-小火苗米爾基于全志T527開發(fā)板一、軟件環(huán)境安裝1.安裝OpenCVsudoapt-getinstalllibopencv-devpython3-
    的頭像 發(fā)表于 12-13 08:04 ?1334次閱讀
    如何用<b class='flag-5'>OpenCV</b>進行手勢<b class='flag-5'>識別</b>--基于米爾全志T527開發(fā)板

    【AI實戰(zhàn)項目】基于OpenCV的“顏色識別項目”完整操作過程

    適用于哪些場景,然后通過Python編寫代碼來實現(xiàn)這些算法,并應用于實際項目中,實現(xiàn)圖像的檢測、識別、分類、定位、測量等目標。華清遠見【python+OpenCV
    的頭像 發(fā)表于 12-09 16:42 ?1403次閱讀
    【AI實戰(zhàn)項目】基于<b class='flag-5'>OpenCV</b>的“顏色<b class='flag-5'>識別</b>項目”完整操作過程

    TPL1401數字電位器失性和非失性的區(qū)別是什么?

    數字電位器存儲類型標注具有“失性”,他的意思是不是說,假設當前已經調節(jié)好電位器處于3.5kΩ這個位置,那么斷電再上電后,電位器就回到初始狀態(tài)位置,不再是3.5kΩ這個位置了。“非失性”就是斷電再上電后還是3.5KΩ這個位置
    發(fā)表于 11-21 07:15

    如何用OpenCV的相機捕捉視頻進行人臉檢測--基于米爾NXP i.MX93開發(fā)板

    : breakvideo.release()cv2.destroyAllWindows() 保存后執(zhí)行”python3 opencv_test.py OpenCV裝好后,可以為后面的人臉檢測提供可行性。 要實現(xiàn)人臉識別
    發(fā)表于 11-15 17:58

    OpenCV圖像識別C++代碼

    安裝OpenCV庫 首先,您需要在您的計算機上安裝OpenCV庫。您可以從OpenCV官網下載預編譯的庫或從源代碼編譯。安裝完成后,確保將OpenCV的頭文件和庫文件添加到您的項目中。
    的頭像 發(fā)表于 07-16 10:42 ?4578次閱讀

    opencv圖像識別有什么算法

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,提供了大量的圖像處理和計算機視覺相關的算法。以下是一些常見的OpenCV
    的頭像 發(fā)表于 07-16 10:40 ?1880次閱讀

    opencv-python和opencv一樣嗎

    不一樣。OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV
    的頭像 發(fā)表于 07-16 10:38 ?2075次閱讀