中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Python+OpenCV實現信用卡數字識別

發布時間:2022-09-20 09:52:15 來源:億速云 閱讀:135 作者:iii 欄目:開發技術

今天小編給大家分享一下怎么用Python+OpenCV實現信用卡數字識別的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

一、模板圖像處理

(1)灰度圖、二值圖轉化

template = cv2.imread('C:/Users/bwy/Desktop/number.png')
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
cv_show('template_gray', template_gray)
 
# 形成二值圖像,因為要做輪廓檢測
ret, template_thresh = cv2.threshold(template_gray, 127, 255, cv2.THRESH_BINARY_INV)
cv_show('template_thresh', template_thresh)

結果如圖所示:

怎么用Python+OpenCV實現信用卡數字識別

怎么用Python+OpenCV實現信用卡數字識別

(2)進行輪廓提取接受參數為二值圖像,得到數字的信息,RETR_EXTERNAL 就是只是需要外輪廓,cv2.CHAIN_APPROX_SIMPLE只保留終點坐標。 

template_contours, hierarchy = cv2.findContours(template_thresh,
                                                cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(template,template_contours,-1,(0,0,255),2)
cv_show('template',template)

-1:代表所的輪廓,我們這里畫出來10個輪廓。(可以用代碼驗證一下)

print(np.array(refCnts,-1,(0,0,255),3)

結果:10

結果如圖所示:

怎么用Python+OpenCV實現信用卡數字識別

 (3)我們需要將輪廓進行大小排序(我們拿到的數據模板不一定向我們前面所展示的從0-9按順序的,所以我們需要進行排序、resize。

def contours_sort(contours, method=0):
    if method == 0:
        contours = sorted(contours, key=lambda x: cv2.boundingRect(x)[0])
    else:
        contours = sorted(contours, key=lambda x: cv2.boundingRect(x)[0], reverse=True)
    return contours

我們調用函數#將輪廓排序,位置從小到大就是數字的信息。然后我們遍歷模板,使用cv2.boudingRect獲得輪廓的位置,提取位置對應的圖片,與數字結合構造成模板字典,dsize = (55, 88),統一大小。

dict_template = {}
for i, contour in enumerate(template_contours):
    # 畫出其外接矩陣,獲得其位置信息
    x, y, w, h = cv2.boundingRect(contour)
    template_img = template_thresh[y:y + h, x:x + w]
    # 使用cv2.resize變化模板的大小
    template_img = cv2.resize(template_img, dsize)
    cv_show('template_img{}'.format(i), template_img)
    dict_template[i] = template_img

 結果如圖所示:

怎么用Python+OpenCV實現信用卡數字識別

怎么用Python+OpenCV實現信用卡數字識別

怎么用Python+OpenCV實現信用卡數字識別

 二、信用卡圖片預處理

(1)進行灰度值

card_gray = cv2.cvtColor(card, cv2.COLOR_BGR2GRAY)
cv_show('card_gray',card_gray)

(2)形成二值圖像,因為要做輪廓檢測,解釋參數:THRESH_OTSU會自動尋找合適的閾值,適合雙峰,需要閾值參數設置為零 二值化

card_thresh =cv2.threshold(card_gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
cv_show('card_thresh',card_thresh)

結果如圖所示:

怎么用Python+OpenCV實現信用卡數字識別

 (3) 我們觀察一下圖片,我們識別圖片上的數字但也會存在黃框和紅框中的干擾,這時候我們可以想到前面所學到的形態學操作禮帽,閉運算...

怎么用Python+OpenCV實現信用卡數字識別

先進行禮帽操作,突出更明亮的區域:

kernel=np.ones((9,3),np.uint8)
card_tophat=cv2.morphologyEx(card_gray,cv2.MORPH_TOPHAT,kernel)
cv_show('card_tophat',card_tophat)

結果如圖:

怎么用Python+OpenCV實現信用卡數字識別

(4)我們進行圖像的輪廓檢測只取外輪廓。在這個圖上有不同的區域,我們如何區分呢,我們可以用h的大小進行估計,這個數據根據項目而定

怎么用Python+OpenCV實現信用卡數字識別

bankcard_contours, hierarchy = cv2.findContours(card_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
banck_card_cnts = []
draw_img = card.copy() 
for i, contour in enumerate(bankcard_contours):
    x, y, w, h = cv2.boundingRect(contour)
    # 數字的x 坐標在 一定的位置范圍
    if 0.5 * card_h < y < 0.6 * card_h: 
        banck_card_cnts.append((x, y, w, h))
        draw_img = cv2.rectangle(draw_img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255),
                                 thickness=2)  # 畫出這個矩形,會在原圖上畫
cv_show_image('rectangle_contours_img', draw_img)

結果如圖:

怎么用Python+OpenCV實現信用卡數字識別

(5)模板匹配,讀出圖像。

for i, locs in enumerate(banck_card_cnts):
 
    x, y, w, h = locs[:]  # 保留了在原始圖像的位置信息
    dst_img = card_thresh[y:y + h, x:x + w]  # 獲得當前圖像的位置和區域
    dst_img = cv2.resize(dst_img, dsize)
    cv_show('rectangle_contours_img', dst_img)
    tm_vals = {}
    for number, temp_img in dict_template.items():
        # 模板匹配,采用計算相關性系數,值越大越相關
        res = cv2.matchTemplate(dst_img, temp_img, cv2.TM_CCOEFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
        tm_vals[number] = max_val
 
    number_tm = max(tm_vals, key=tm_vals.get)
 
    # 在圖像上畫出結果來
    draw_img = cv2.rectangle(draw_img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255),
                             thickness=2)  
    cv2.putText(draw_img, str(number_tm), (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.65,
                color=(0, 0, 255), thickness=2)
 
cv_show_image('final_result', draw_img)

結果如圖所示: 

怎么用Python+OpenCV實現信用卡數字識別

怎么用Python+OpenCV實現信用卡數字識別

怎么用Python+OpenCV實現信用卡數字識別

怎么用Python+OpenCV實現信用卡數字識別

 只是展示一部分(倒序輸出)

怎么用Python+OpenCV實現信用卡數字識別

以上就是“怎么用Python+OpenCV實現信用卡數字識別”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邵阳县| 武清区| 利辛县| 平安县| 武安市| 财经| 永胜县| 德阳市| 孝感市| 康平县| 旬阳县| 栖霞市| 财经| 金乡县| 曲阜市| 花莲县| 婺源县| 柳江县| 仁怀市| 噶尔县| 阿瓦提县| 铁力市| 金华市| 肥城市| 许昌县| 崇州市| 黄平县| 巫溪县| 揭东县| 齐齐哈尔市| 安仁县| 泰兴市| 东宁县| 宽城| 新郑市| 通化市| 永善县| 竹山县| 鄂托克旗| 陇西县| 赣州市|