国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

8.OpenCV-識(shí)別身份證號(hào)碼(Python)

這篇具有很好參考價(jià)值的文章主要介紹了8.OpenCV-識(shí)別身份證號(hào)碼(Python)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

需求描述:

通過(guò)OpenCV識(shí)別身份證照片上的身份證號(hào)碼(僅識(shí)別身份證號(hào)碼)

實(shí)現(xiàn)思路:

1.將身份證號(hào)中的0,1,2,3,4,5,6,7,8,9作為模板,與身份證照片中的身份證號(hào)碼區(qū)域進(jìn)行模板匹配。

2.先要制作一個(gè)身份證號(hào)碼模板,我這里弄了一個(gè),基本上可以用。

8.OpenCV-識(shí)別身份證號(hào)碼(Python)

?3.識(shí)別出身份證照片身份證號(hào)區(qū)域,進(jìn)行圖像模板匹配。

? ?以下面這樣圖為例(你也可以替換為你要識(shí)別的圖片):

8.OpenCV-識(shí)別身份證號(hào)碼(Python)

?4.識(shí)別出身份證號(hào)碼后,在圖中標(biāo)記出識(shí)別結(jié)果。

運(yùn)行效果:

8.OpenCV-識(shí)別身份證號(hào)碼(Python)

Python源代碼目前只能識(shí)別標(biāo)準(zhǔn)角度拍攝照片,拍攝角度變形的無(wú)法識(shí)別):

import cv2
import numpy as np 

rectKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(15,15)) #kernel1 = np.ones((15, 15), np.uint8)
sqKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

#輪廓排序
def sort_contours(cnts,method="left-to-right"):
    reverse=False
    i=0
    if method=="right-to-left" or method=="bottom-to-top":
        reverse=True
    if method=="top-to-bottom" or method=="bottom-to-top":
        i=1
    boundingBoxes=[cv2.boundingRect(c) for c in cnts] #外接矩形
    (cnts,boundingBoxes)=zip(*sorted(zip(cnts,boundingBoxes),key=lambda b:b[1][i],reverse=reverse))
    return cnts,boundingBoxes

# 第一步:預(yù)處理模板文件
templateImg = cv2.imread("template.jpg") #template.jpg 即為模板文件,上面那張0-9數(shù)字圖片
templateImg = cv2.resize(templateImg, (900, 200), interpolation=cv2.INTER_CUBIC)
#轉(zhuǎn)灰度圖
templateGray=cv2.cvtColor(templateImg,cv2.COLOR_BGR2GRAY) 
cv2.imshow("1.1 templateGray",templateGray)
#二值處理
templateGray=cv2.threshold(templateGray,30,255,cv2.THRESH_BINARY_INV)[1] 
# cvblackhat = cv2.morphologyEx(templateGray, cv2.MORPH_BLACKHAT, np.ones((50, 50), np.uint8))
# templateGray=cv2.threshold(cvblackhat,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1] 
cv2.imshow("1.2 threshold",templateGray)

#提取輪廓(10個(gè)數(shù)字的外部輪廓)
templateContours,hierarchy=cv2.findContours(templateGray.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(templateImg,templateContours,-1,(0,0,255),3)
cv2.imshow("1.3 drawContours",templateImg)
templateContours=sort_contours(templateContours,method="left-to-right")[0]

#用于做模板匹配的圖像集合
templates={}
for(i,c) in enumerate(templateContours):
    (x,y,w,h)=cv2.boundingRect(c) #外接矩形
    roi=templateGray[y:y+h,x:x+w]
    roi=cv2.resize(roi,(57,88))
    templates[i]=roi

#第二步:處理身份證圖片

# 1.讀取原圖
idimg = cv2.imread("idcard.jpg") #需要進(jìn)行識(shí)別的圖片
idimg = cv2.resize(idimg, (509, 300), interpolation=cv2.INTER_CUBIC)
idimgok = idimg.copy()
cv2.imshow("1.origin", idimg)

#2.轉(zhuǎn)灰度圖
gray = cv2.cvtColor(idimg, cv2.COLOR_BGR2GRAY)
cv2.imshow("2.gray", gray)

#3.黑帽運(yùn)算:移除干擾項(xiàng)
cvblackhat = cv2.morphologyEx(gray, cv2.MORPH_BLACKHAT, rectKernel)
cv2.imshow("3.black", cvblackhat)

#4.頂帽運(yùn)算:突出輪廓
tophat=cv2.morphologyEx(cvblackhat,cv2.MORPH_TOPHAT,rectKernel)
cv2.imshow("4.tophat", tophat)

#5.邊緣檢測(cè)
sobel=cv2.Sobel(tophat,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1)
sobel=np.absolute(sobel)
(min,max)=(np.min(sobel),np.max(sobel))
sobel=(255*((sobel-min)/(max-min)))
sobel=sobel.astype("uint8")
cv2.imshow("5.sobel", sobel)

#6.閉操作,先膨脹,再腐蝕
sobel=cv2.morphologyEx(sobel,cv2.MORPH_CLOSE,rectKernel) 
cv2.imshow("6.close", sobel)

#7.二值化突出輪廓,自動(dòng)閾值范圍 cv2.THRESH_BINARY|cv2.THRESH_OTSU
thresh=cv2.threshold(sobel,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1] 
cv2.imshow("7.thresh", thresh)

#8.再閉操作,先膨脹,再腐蝕
thresh=cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,sqKernel) 
cv2.imshow("8.close2", thresh)

#9.提取輪廓,并在圖上標(biāo)記輪廓
cnts,hierarchy=cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
mark=idimg.copy()
cv2.drawContours(mark,cnts,-1,(0,0,255),2)
cv2.imshow("9.mark", mark)

#身份證區(qū)域,雖然只有一個(gè)輪廓,這里還是用集合來(lái)處理
pidArea=[]
for(i,c) in enumerate(cnts):
    (x,y,w,h)=cv2.boundingRect(c)
    ar=w/float(h)
    if ar>12 and ar<40:
        pidArea.append((x,y,w,h)) #身份證號(hào)區(qū)域長(zhǎng)寬比比較明顯,算是一個(gè)比較明顯的特征
        break
#pidArea=sorted(pidArea,key=lambda x:x[0])#若有多個(gè)區(qū)域,需進(jìn)行從左到右排序

#10.模板匹配
output=[] 
for(i,(gx,gy,gw,gh)) in enumerate(pidArea):
    area=gray[gy-5:gy+gh+5,gx-5:gx+gw+5] #稍微擴(kuò)展點(diǎn)區(qū)域,保證內(nèi)容都能框住
    cv2.imshow("9.matched", area) 

    #下面操作跟處理模板圖像一樣:
    #先黑帽處理,移除干擾項(xiàng),再二值化處理(自動(dòng)閾值)    
    area = cv2.morphologyEx(area, cv2.MORPH_BLACKHAT, np.ones((10, 10), np.uint8))
    area=cv2.threshold(area,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1] 
    cv2.imshow("10.threshold", area) 

    # 再檢測(cè)輪廓
    numContours,hierarchy=cv2.findContours(area.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)     

    #注意:此處需判斷輪廓的個(gè)數(shù)是否是18個(gè),對(duì)應(yīng)18個(gè)數(shù)字 
    numContours=sort_contours(numContours,method="left-to-right")[0]

    #11.遍歷輪廓,并逐個(gè)與模板圖像進(jìn)行匹配,將最高得分保留
    for c in numContours:
        (x,y,w,h)=cv2.boundingRect(c)
        roi=area[y:y+h,x:x+w]
        roi=cv2.resize(roi,(57,88)) #模板也做了縮放,相同尺寸進(jìn)行比較
        scores=[]
        #跟10張模板圖片進(jìn)行模板匹配
        for (j,templateROI)in templates.items():
            result=cv2.matchTemplate(roi,templateROI,cv2.TM_CCOEFF)
            (_,score,_,_)=cv2.minMaxLoc(result)
            scores.append(score) #scores中存放了當(dāng)前輪廓對(duì)應(yīng)0-10中每個(gè)數(shù)字的概率

        #將分值最大的保留下來(lái)
        num=np.argmax(scores)  #np.argmax():獲取array的某一個(gè)維度中數(shù)值最大的那個(gè)元素的索引,索引即為對(duì)應(yīng)數(shù)字
        output.append(str(num))
        

#12.在原圖上繪制識(shí)別結(jié)果
index=0
(gx,gy,gw,gh)=pidArea[0] #身份證區(qū)域位置
for c in numContours:
    (x,y,w,h)=cv2.boundingRect(c) #數(shù)字輪廓位置
    num=output[index]
    cv2.putText(idimg,str(num),(gx+x-8 ,gy+y-15),cv2.FONT_HERSHEY_SIMPLEX,0.65,(0,0,255),2) 
    index=index+1    
cv2.imshow("12.done", idimg)

print("識(shí)別結(jié)果:"+"".join(output))
cv2.waitKey(0)

?運(yùn)行結(jié)果:

模板處理

8.OpenCV-識(shí)別身份證號(hào)碼(Python)

圖像處理

8.OpenCV-識(shí)別身份證號(hào)碼(Python)

8.OpenCV-識(shí)別身份證號(hào)碼(Python)

?特別說(shuō)明:

1.對(duì)輸入身份證照片有要求,必須是完全的身份證照片,不能有背景,不能變形。

2.只識(shí)別了身份證號(hào)區(qū)域,如需識(shí)別其他信息,可以自行修改代碼。

3.如無(wú)法識(shí)別你的圖片,請(qǐng)手動(dòng)調(diào)試代碼,注釋都在代碼里,修改對(duì)應(yīng)步驟參數(shù),多試幾次。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-506320.html

到了這里,關(guān)于8.OpenCV-識(shí)別身份證號(hào)碼(Python)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 身份證號(hào)碼正則表達(dá)式詳解

    身份證號(hào)碼正則表達(dá)式詳解

    公民身份號(hào)碼是特征組合碼,由十七位數(shù)字本體碼和一 位 校驗(yàn)碼 組成 。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗(yàn)碼。 地址碼 : ( 身份證號(hào)碼第一位到第六位 ) 表示編碼對(duì)象常住戶(hù)口所在 的 行政區(qū)劃代碼,按

    2024年02月06日
    瀏覽(98)
  • java 根據(jù)身份證號(hào)碼判斷性別

    在Java中,您可以根據(jù)身份證號(hào)碼的規(guī)則來(lái)判斷性別。中國(guó)的身份證號(hào)碼通常采用的是以下規(guī)則: 第17位數(shù)字代表性別,奇數(shù)表示男性,偶數(shù)表示女性。 通常,男性的出生日期的第15、16位數(shù)字是01,女性是02。 請(qǐng)注意,這只是一個(gè)大致的規(guī)則,實(shí)際上,有些特殊情況下的身份

    2024年02月07日
    瀏覽(88)
  • 基于Python實(shí)現(xiàn)身份證信息識(shí)別
  • 根據(jù)身份證號(hào)碼判斷是否是未成年人

    ?/**** ? ? ?* 根據(jù)身份證號(hào)計(jì)算年齡 ? ? ?* @param str ? ? ? ?* @param currDate? ? ? ?* @return ? ? ?*/ ? ? public boolean calcYear(String str, Date currDate){ ? ? ? ? DateFormat dateFormat = new SimpleDateFormat(\\\"yyyyMMdd\\\"); ? ? ? ? Long year = Long.parseLong(str.substring(0,4)); ? ? ? ? Long month = Long.parseLong(st

    2023年04月23日
    瀏覽(102)
  • Python使用阿里API進(jìn)行身份證識(shí)別

    Python使用阿里API進(jìn)行身份證識(shí)別

    孟莉蘋(píng),女,西安工程大學(xué)電子信息學(xué)院,2021級(jí)碩士研究生,張宏偉人工智能課題組 研究方向:機(jī)器視覺(jué)與人工智能 電子郵件:2425613875@qq.com 憑借領(lǐng)先的人工智能與知識(shí)圖譜技術(shù),對(duì)身份證正反面自動(dòng)識(shí)別,并提取姓名、出生日期、身份證號(hào)、住址、性別、民族、發(fā)證機(jī)關(guān)

    2024年02月07日
    瀏覽(23)
  • java從身份證號(hào)碼中提取出生年月日

    給一個(gè)String 類(lèi)型的 身份證號(hào)碼,需要從這串?dāng)?shù)字中獲取出生日期、性別、年齡

    2024年02月15日
    瀏覽(89)
  • 身份證號(hào)碼,格式校驗(yàn):@IdCard(Validation + 原生實(shí)現(xiàn)校驗(yàn)邏輯)

    身份證號(hào)碼,格式校驗(yàn):@IdCard(Validation + 原生實(shí)現(xiàn)校驗(yàn)邏輯)

    自定義一個(gè)用于校驗(yàn) 身份證號(hào)碼 格式的注解 @IdCard ,能夠和現(xiàn)有的 Validation 參數(shù)校驗(yàn)機(jī)制兼容,使用方式和其他校驗(yàn)注解保持一致(使用 @Valid 注解接口參數(shù))。 本文使用原生方式實(shí)現(xiàn)校驗(yàn)邏輯,校驗(yàn)規(guī)則的實(shí)現(xiàn)較為基礎(chǔ);Hutool工具提供了更加完善的校驗(yàn)工具,可以考慮使

    2024年02月07日
    瀏覽(97)
  • 身份證號(hào)碼的正則表達(dá)式及驗(yàn)證詳解(JavaScript,Regex)

    簡(jiǎn)言 在做用戶(hù)實(shí)名驗(yàn)證時(shí),常會(huì)用到身份證號(hào)碼的正則表達(dá)式及校驗(yàn)方案。本文列舉了兩種驗(yàn)證方案,大家可以根據(jù)自己的項(xiàng)目實(shí)際情況,選擇適合的方案 身份證號(hào)碼說(shuō)明 居民身份證號(hào)碼,正確、正式的稱(chēng)謂應(yīng)該是“公民身份號(hào)碼”。根據(jù)【中華人民共和國(guó)國(guó)家標(biāo)準(zhǔn) GB 11

    2023年04月20日
    瀏覽(437)
  • 學(xué)以致用——Java驗(yàn)證身份證號(hào)碼是否正確(帶校驗(yàn)算法)

    需求: 驗(yàn)證身份證號(hào)碼是否正確(帶校驗(yàn)算法) 源碼: 運(yùn)行結(jié)果:

    2024年02月11日
    瀏覽(110)
  • 常用的表單校驗(yàn)規(guī)則——郵箱/QQ/身份證號(hào)碼/微信/電話/數(shù)字字母/整數(shù)/文本/密碼等

    1.郵箱校驗(yàn)規(guī)則 2.郵箱校驗(yàn)規(guī)則 ?3.QQ校驗(yàn)規(guī)則 4.身份證號(hào)碼校驗(yàn)規(guī)則? ?5.微信校驗(yàn)規(guī)則 6.電話校驗(yàn)規(guī)則? 7.銀行卡號(hào)校驗(yàn)規(guī)則? 8.數(shù)字字母校驗(yàn)規(guī)則? 9.整數(shù)校驗(yàn)規(guī)則? 10.數(shù)字校驗(yàn)規(guī)則? 11.文本校驗(yàn)規(guī)則? 12.密碼校驗(yàn)規(guī)則? 最后附上 rules 中的使用方法? ? ? ? ? ? ?

    2024年02月05日
    瀏覽(92)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包