chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV:易上手的數(shù)字識(shí)別實(shí)踐案例

新機(jī)器視覺(jué) ? 來(lái)源:新機(jī)器視覺(jué) ? 作者:新機(jī)器視覺(jué) ? 2021-03-29 13:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。因?yàn)橛X(jué)得一板一眼地學(xué)習(xí)OpenCV太過(guò)枯燥,于是在網(wǎng)上找了一個(gè)以項(xiàng)目為導(dǎo)向的教程學(xué)習(xí)。話不多說(shuō),動(dòng)手做起來(lái)。

1、案例介紹

提供信用卡上的數(shù)字模板:


要求:識(shí)別出信用卡上的數(shù)字,并將其直接打印在原圖片上。雖然看起來(lái)很蠢,但既然可以將數(shù)字打印在圖片上,說(shuō)明已經(jīng)成功識(shí)別數(shù)字,因此也可以將其轉(zhuǎn)換為數(shù)字文本保存。車牌號(hào)識(shí)別等項(xiàng)目的思路與此案例類似。

示例:

原圖

處理后的圖

大致分為如下幾個(gè)步驟:

1.模板讀入
2.模板預(yù)處理,將模板數(shù)字分開,并排序
3.輸入圖像預(yù)處理,將圖像中的數(shù)字部分提取出來(lái)
4.將數(shù)字與模板數(shù)字進(jìn)行匹配,匹配率最高的即為對(duì)應(yīng)數(shù)字。

1、模板讀入,以及一些包的導(dǎo)入,函數(shù)定義等

import cv2 as cvimport numpy as npimport myutilsdef cv_show(name, img): # 自定義的展示函數(shù) cv.imshow(name, img) cv.waitKey(0)# 讀入模板圖n = 'text'img = cv.imread("images/ocr_a_reference.png")#cv_show(n,template)#自定義的展示函數(shù),方便顯示圖

2、模板預(yù)處理,將模板數(shù)字分開,并排序

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

# 模板轉(zhuǎn)換為灰度圖ref = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# cv_show(n, ref) # 轉(zhuǎn)換為二值圖,把數(shù)字部分變?yōu)榘咨玶ef = cv.threshold(ref, 10, 255, cv.THRESH_BINARY_INV)[1] # 騷寫法,函數(shù)多個(gè)返回值為元組,這里取第二個(gè)返回值cv_show(n, ref) # 對(duì)模板進(jìn)行輪廓檢測(cè),得到輪廓信息refCnts, hierarchy = cv.findContours(ref.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)cv.drawContours(img, refCnts, -1, (0, 0, 255), 2) # 第一個(gè)參數(shù)為目標(biāo)圖像#cv_show(n,img

紅色部分即為檢測(cè)出的輪廓。接下來(lái)進(jìn)行輪廓排序,因?yàn)闄z測(cè)出的輪廓是無(wú)序的,因此要按照輪廓的左上角點(diǎn)的x坐標(biāo)來(lái)排序。輪廓排序后按順序放入字典,則字典中的鍵值對(duì)是正確匹配的,如‘0’對(duì)應(yīng)輪廓0 ,‘1’對(duì)應(yīng)輪廓1。

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

至此,模板圖處理完畢。

3、輸入圖像預(yù)處理,將圖像中的數(shù)字部分提取出來(lái)

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

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

接下來(lái)讀入圖片,調(diào)整圖片大小,轉(zhuǎn)換為灰度圖。

# 待分析圖片讀入,預(yù)處理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

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

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

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

再通過(guò)sobel算子檢測(cè)邊緣,進(jìn)行一次閉操作,二值化,再進(jìn)行一次閉操作,填補(bǔ)空洞。

# x方向的Sobel算子gradX = cv.Sobel(tophat, cv.CV_32F, 1, 0, ksize=3) gradX = np.absolute(gradX) # absolute: 計(jì)算絕對(duì)值min_Val, max_val = np.min(gradX), np.max(gradX)gradX = (255 * (gradX - min_Val) / (max_val - min_Val))gradX = gradX.astype("uint8") # 通過(guò)閉操作(先膨脹,再腐蝕)將數(shù)字連在一起. 將本是4個(gè)數(shù)字的4個(gè)框膨脹成1個(gè)框,就腐蝕不掉了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] # 閉操作,填補(bǔ)空洞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、模板匹配

將模板數(shù)字和待識(shí)別的圖片都處理好后,就可以進(jìn)行匹配了。

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

接下來(lái),遍歷每一個(gè)大輪廓,每個(gè)大輪廓中有四個(gè)數(shù)字,對(duì)應(yīng)四個(gè)小輪廓。將小輪廓與模板匹配。

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

最后將其打印出來(lái),任務(wù)就完成了。

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

總結(jié)

信用卡識(shí)別的案例用到了圖像處理的一些基本操作,對(duì)剛上手CV的人來(lái)說(shuō)還是比較友好的。

責(zé)任編輯:lq

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

    關(guān)注

    2

    文章

    22

    瀏覽量

    10336
  • 圖像預(yù)處理
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    6440
  • OpenCV
    +關(guān)注

    關(guān)注

    33

    文章

    652

    瀏覽量

    44606

原文標(biāo)題:OpenCV萌新福音:易上手的數(shù)字識(shí)別實(shí)踐案例

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Renesas QuickConnect Beginners Kit 快速上手:從入門到實(shí)踐

    Renesas QuickConnect Beginners Kit 快速上手:從入門到實(shí)踐 在當(dāng)今快速發(fā)展的電子科技領(lǐng)域,快速原型開發(fā)和高效的系統(tǒng)設(shè)計(jì)是工程師們追求的目標(biāo)。Renesas
    的頭像 發(fā)表于 12-29 09:25 ?155次閱讀

    沒(méi)有專利的opencv-python 版本

    所有 官方發(fā)布的 opencv-python 核心版本(無(wú) contrib 擴(kuò)展)都無(wú)專利風(fēng)險(xiǎn)——專利問(wèn)題僅存在于 opencv-contrib-python 擴(kuò)展模塊中的少數(shù)算法(如早期 SIFT
    發(fā)表于 12-13 12:37

    零成本鋼鐵俠手套!樹莓派+OpenCV 秒變手勢(shì)遙控器!

    大家好,這是一個(gè)樹莓派和OpenCV的連載專題。使用樹莓派與OpenCV實(shí)現(xiàn)姿態(tài)估計(jì)和面部特征點(diǎn)追蹤使用樹莓派與OpenCV實(shí)現(xiàn)面部和運(yùn)動(dòng)追蹤的云臺(tái)系統(tǒng)使用樹莓派和OpenCV實(shí)現(xiàn)手部
    的頭像 發(fā)表于 08-16 16:16 ?1132次閱讀
    零成本鋼鐵俠手套!樹莓派+<b class='flag-5'>OpenCV</b> 秒變手勢(shì)遙控器!

    如何使用樹莓派與OpenCV實(shí)現(xiàn)面部和運(yùn)動(dòng)追蹤的云臺(tái)系統(tǒng)?

    大家好,這是一個(gè)樹莓派和OpenCV的連載專題。使用樹莓派與OpenCV實(shí)現(xiàn)姿態(tài)估計(jì)和面部特征點(diǎn)追蹤使用樹莓派與OpenCV實(shí)現(xiàn)面部和運(yùn)動(dòng)追蹤的云臺(tái)系統(tǒng)使用樹莓派和OpenCV實(shí)現(xiàn)手部
    的頭像 發(fā)表于 08-14 17:45 ?1137次閱讀
    如何使用樹莓派與<b class='flag-5'>OpenCV</b>實(shí)現(xiàn)面部和運(yùn)動(dòng)追蹤的云臺(tái)系統(tǒng)?

    如何使用樹莓派+OpenCV實(shí)現(xiàn)姿態(tài)估計(jì)和面部特征點(diǎn)追蹤?

    大家好,這是一個(gè)樹莓派和OpenCV的連載專題。使用樹莓派與OpenCV實(shí)現(xiàn)姿態(tài)估計(jì)和面部特征點(diǎn)追蹤使用樹莓派與OpenCV實(shí)現(xiàn)面部和運(yùn)動(dòng)追蹤的云臺(tái)系統(tǒng)使用樹莓派和OpenCV實(shí)現(xiàn)手部
    的頭像 發(fā)表于 08-13 17:44 ?1172次閱讀
    如何使用樹莓派+<b class='flag-5'>OpenCV</b>實(shí)現(xiàn)姿態(tài)估計(jì)和面部特征點(diǎn)追蹤?

    【GM-3568JHF開發(fā)板免費(fèi)體驗(yàn)】OpenCV開發(fā)環(huán)境安裝和計(jì)數(shù)程序開發(fā)

    、 Android 等系統(tǒng)上運(yùn)行,并通過(guò)Python接口簡(jiǎn)化操作。 sudo apt install libopencv-dev python3-opencv 四、OpenCV圖像識(shí)別測(cè)試 使用python3
    發(fā)表于 08-09 13:30

    用樹莓派 + OpenCV 打造人臉識(shí)別技術(shù)!

    在本指南中,我們將教您如何使用OpenCV和面部識(shí)別庫(kù)(兩個(gè)出色的開源項(xiàng)目)設(shè)置樹莓派來(lái)檢測(cè)和識(shí)別面部。在這個(gè)設(shè)置中,所有的數(shù)據(jù)和處理都將在Pi上本地執(zhí)行,這意味著您的所有面部和數(shù)據(jù)都不會(huì)離開Pi
    的頭像 發(fā)表于 07-29 17:27 ?1220次閱讀
    用樹莓派 + <b class='flag-5'>OpenCV</b> 打造人臉<b class='flag-5'>識(shí)別</b>技術(shù)!

    基于FPGA的數(shù)字識(shí)別系統(tǒng)設(shè)計(jì)

    在圖像處理領(lǐng)域,圖像識(shí)別是較為困難而關(guān)鍵的技術(shù)。這項(xiàng)技術(shù)被廣泛的應(yīng)用到娛樂(lè)、工業(yè)、軍事等領(lǐng)域。本次設(shè)計(jì)數(shù)字識(shí)別系統(tǒng)已經(jīng)在車牌識(shí)別、運(yùn)動(dòng)員號(hào)碼識(shí)別
    的頭像 發(fā)表于 07-16 14:28 ?1302次閱讀
    基于FPGA的<b class='flag-5'>數(shù)字</b><b class='flag-5'>識(shí)別</b>系統(tǒng)設(shè)計(jì)

    基于LockAI視覺(jué)識(shí)別模塊:C++人臉識(shí)別

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

    基于LockAI視覺(jué)識(shí)別模塊:手寫數(shù)字識(shí)別

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

    基于LockAI視覺(jué)識(shí)別模塊:手寫數(shù)字識(shí)別

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

    基于LockAI視覺(jué)識(shí)別模塊:C++條碼識(shí)別

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

    【「# ROS 2智能機(jī)器人開發(fā)實(shí)踐」閱讀體驗(yàn)】視覺(jué)實(shí)現(xiàn)的基礎(chǔ)算法的應(yīng)用

    : 一、機(jī)器人視覺(jué):從理論到實(shí)踐 第7章詳細(xì)介紹了ROS2在機(jī)器視覺(jué)領(lǐng)域的應(yīng)用,涵蓋了相機(jī)標(biāo)定、OpenCV集成、視覺(jué)巡線、二維碼識(shí)別以及深度學(xué)習(xí)目標(biāo)檢測(cè)等內(nèi)容。通過(guò)學(xué)習(xí),我認(rèn)識(shí)到: 相機(jī)標(biāo)定的重要性
    發(fā)表于 05-03 19:41

    基于LockAI視覺(jué)識(shí)別模塊:C++圖像采集例程

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

    EMC電機(jī)控制器測(cè)試整改:從問(wèn)題識(shí)別到優(yōu)化實(shí)踐

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