如何用python識(shí)別滑塊驗(yàn)證碼中的缺口
驗(yàn)證碼往往是爬蟲(chóng)路上的一只攔路虎,而其花樣也是層出不窮:圖片驗(yàn)證、滑塊驗(yàn)證、交互式驗(yàn)證、行為驗(yàn)證等。隨著OCR技術(shù)的成熟,圖片驗(yàn)證已經(jīng)漸漸淡出主流,而滑塊驗(yàn)證越來(lái)越多地出現(xiàn)在大眾視野。
“這么厲害,這小子長(zhǎng)啥樣呢?”沒(méi)錯(cuò),它就長(zhǎng)這損sai:
解決它的方法也很直觀,首先找到缺口的位置(通常只需要X軸的位置),然后拖動(dòng)滑塊即可。
今天kimol君將帶領(lǐng)大家用python識(shí)別出滑塊驗(yàn)證中的缺口位置。
一、缺口識(shí)別
識(shí)別圖片中的缺口,主要是利用python中的圖像處理庫(kù)cv2,其安裝方法如下:
pip install opencv-python
注:這里并不是“pip install cv2”哦~
1.讀取圖片
滑塊驗(yàn)證的圖片分為兩部分,一個(gè)是背景圖片:
另一個(gè)是缺口圖片:
利用imread函數(shù)將其讀?。?/p>
# 讀取背景圖片和缺口圖片 bg_img = cv2.imread('bg.jpg') # 背景圖片 tp_img = cv2.imread('tp.png') # 缺口圖片
2.識(shí)別圖片邊緣
為了更好地將缺口與背景匹配,我們首先得識(shí)別出圖片的邊緣:
# 識(shí)別圖片邊緣 bg_edge = cv2.Canny(bg_img, 100, 200) tp_edge = cv2.Canny(tp_img, 100, 200)
這一步很關(guān)鍵!否則缺口匹配將不準(zhǔn)確。
這里得到了圖片邊緣的灰度圖,進(jìn)一步將其圖片格式轉(zhuǎn)為RGB格式:
# 轉(zhuǎn)換圖片格式 bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB) tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
轉(zhuǎn)換后的背景圖為:
轉(zhuǎn)換后的缺口圖為:
3.缺口匹配
利用cv2中的matchTemplate函數(shù),可以在背景圖片中搜索對(duì)應(yīng)的缺口,具體代碼如下:
# 缺口匹配 res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
res為每個(gè)位置的匹配結(jié)果,代表了匹配的概率,選出其中概率最高的點(diǎn),即為缺口匹配的位置:
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 尋找最優(yōu)匹配
min_val,max_val,min_loc,max_loc分別為匹配的最小值、匹配的最大值、最小值的位置、最大值的位置。
ps.當(dāng)然,這里完全可以自己寫(xiě)一個(gè)循環(huán)來(lái)實(shí)現(xiàn),但是有現(xiàn)成的函數(shù)為什么不用呢?
至此,我們已經(jīng)有了缺口的位置,其X軸坐標(biāo)為:
X = max_loc[0]
為了更直觀地展示缺口的位置,我們將缺口用矩形框標(biāo)注出來(lái):
# 繪制方框 th, tw = tp_pic.shape[:2] tl = max_loc # 左上角點(diǎn)的坐標(biāo) br = (tl[0]+tw,tl[1]+th) # 右下角點(diǎn)的坐標(biāo) cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 繪制矩形 cv2.imwrite('out.jpg', bg_img) # 保存在本地
結(jié)果如下:
完美~ 收工?。?!
二、完整代碼
為了在實(shí)際應(yīng)用中更方便的使用,我們將代碼封裝為一個(gè)函數(shù):
def identify_gap(bg,tp,out): ''' bg: 背景圖片 tp: 缺口圖片 out:輸出圖片 ''' # 讀取背景圖片和缺口圖片 bg_img = cv2.imread(bg) # 背景圖片 tp_img = cv2.imread(tp) # 缺口圖片 # 識(shí)別圖片邊緣 bg_edge = cv2.Canny(bg_img, 100, 200) tp_edge = cv2.Canny(tp_img, 100, 200) # 轉(zhuǎn)換圖片格式 bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB) tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB) # 缺口匹配 res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 尋找最優(yōu)匹配 # 繪制方框 th, tw = tp_pic.shape[:2] tl = max_loc # 左上角點(diǎn)的坐標(biāo) br = (tl[0]+tw,tl[1]+th) # 右下角點(diǎn)的坐標(biāo) cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 繪制矩形 cv2.imwrite(out, bg_img) # 保存在本地 # 返回缺口的X坐標(biāo) return tl[0]
這里選擇了讀取本地圖片文件,在爬蟲(chóng)過(guò)程中其實(shí)不是特別方便。如果有感興趣的小伙伴,可以自己改動(dòng)一下,將輸入改為圖片流即可。
以上就是如何用python識(shí)別滑塊中的缺口的詳細(xì)內(nèi)容,更多關(guān)于python識(shí)別滑塊中的缺口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python的Tkinter點(diǎn)擊按鈕觸發(fā)事件的例子
今天小編就為大家分享一篇Python的Tkinter點(diǎn)擊按鈕觸發(fā)事件的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07python 實(shí)現(xiàn)批量替換文本中的某部分內(nèi)容
今天小編就為大家分享一篇python 實(shí)現(xiàn)批量替換文本中的某部分內(nèi)容,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12python用matplotlib繪制二維坐標(biāo)軸,設(shè)置箭頭指向,文本內(nèi)容方式
這篇文章主要介紹了python用matplotlib繪制二維坐標(biāo)軸,設(shè)置箭頭指向,文本內(nèi)容方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Pytorch中的masked_fill基本知識(shí)操作
本文主要介紹了PyTorch中的masked_fill函數(shù)的基本知識(shí)和使用方法,masked_fill函數(shù)接受一個(gè)輸入張量和一個(gè)布爾掩碼作為主要參數(shù),掩碼的形狀必須與輸入張量相同,掩碼操作根據(jù)掩碼中的布爾值在輸出張量中填充指定的值或保留輸入張量中的值2024-10-10Python元組 tuple的概念與基本操作詳解【定義、創(chuàng)建、訪問(wèn)、計(jì)數(shù)、推導(dǎo)式等】
這篇文章主要介紹了Python元組 tuple的概念與基本操作,結(jié)合實(shí)例形式詳細(xì)分析了Python元組的定義、創(chuàng)建、訪問(wèn)、計(jì)數(shù)、推導(dǎo)式等常見(jiàn)操作技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-10-10基于python實(shí)現(xiàn)生成指定大小txt文檔
這篇文章主要介紹了基于python實(shí)現(xiàn)生成指定大小txt文檔,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07