如何用python識別滑塊驗證碼中的缺口

2022-09-25 22:54:17 字數 2518 閱讀 6722

驗證碼往往是爬蟲路上的乙隻攔路虎,而其花樣也是層出不窮:驗證、滑塊驗證、互動式驗證、行為驗證等。隨著ocr技術的成熟,驗證已經漸漸淡出主流,而滑塊驗證越來越多地出現在大眾視野。

「這麼厲害,這小子長啥樣呢?」沒錯,它就長這損sai:

解決它的方法也很直觀,首先找到缺口的位置(通常只需要x軸的位置),然後拖動滑塊即可。

今天kimol君將帶領大家用python識別出滑塊驗證中的缺口位置。

識別中的缺口,主要是利用python中的影象處理庫cv2,其安裝方法如下:

pip install opencv-python

注:這裡並不是「pip install cv2」哦~

滑塊驗證的分為兩部分,乙個是背景:

另乙個是缺口:

利用imread函式將其讀取:

# 讀取背景和缺口

bg_img = cv2.imread('bg.jpg') # 背景

tp_img = cv2.imread('tp.png') # 缺口

為了更好地將缺口與背景匹配,我們首先得識別出的邊緣:

# 識別邊緣

bg_edge = cv2.canny(bg_img, 100, 200)

tp_edge = cv2.canny(tp_img, 100, 200)

這一步很關鍵!否則缺口匹配將不準確。

這裡得到了邊緣的灰度圖,進一步將其格式轉為rgb格式:

# 轉換格式

bg_pic = cv2.cvtcolor(bg_edge, cv2.color_gray2rgb)

tp_pic = cv2.cvtcolor(tp_edge, cv2.color_gray2rgb)

轉換後的背景圖為:

轉換後的缺口圖為:

利用cv2中的matchtemplate函式,可以在背景中搜尋對應的缺口,具體**如下:

# 缺口匹配

res = cv2.matchtemplate(bg_pic, tp_pic, cv2.tm_ccoeff_normed)

res為每個位置的匹配結果,代表了匹配的概率,選出其中概率最高的點,即為缺口匹配的位置:

min_val, max_val, min_loc, max_loc = cv2.minmaxloc(res) # 尋找最優匹配

min_val,max_val,min_loc,max_loc分別為匹配的最小值、匹配的最大值、最小值的位置、最大值的位置。

ps.當然,這裡完全可以自己寫乙個迴圈來實現,但是有現成的函式為什麼不用呢?

至此,我們已經有了缺口的位置,其x軸座標為:

x = max_loc[0]

為了更直觀地展示缺口的位置,我們將缺口用矩形框標註出來:

# 繪製方框

th, tw = tp_pic.shape[:2]

tl = max_loc # 左上角點的座標

br = (tl[0]+tw,tl[1]+th) # 右下角點的座標

cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 繪製矩形

cv2.imwrite('out.jpg', bg_img) # 儲存在本地

結果如下:

完美~ 收工!!!

為了在實際應用中更方便的使用,我們將**封裝為乙個函式程式設計客棧:

def identify_gap(bg,tp,out):

'''bg: 背景

tp: 缺口

out:輸出

'''# 讀取背景和缺口

bg_img = cv2.imread(bg) # 背景

tp_img = cv2.imread(tp) # 缺口

# 識別邊緣

bg_edge = cv2.canny(bg_img, 100, 200)

tp_edge = cv2.canny(tp_img, 100, 200)

# 轉換格式

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) # 尋找最優匹配

# 繪製方框

th, tw = tp_pic.shape[:2]

tl = max_loc # 左上角點的座標

br = (tl[0]+tw,tl[1]+th) # 右下角點的座標

cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 繪製矩形

cv2.imwrite(out, bg_img) # 儲存在本地

# 返回缺口的x座標

return www.cppcns.comtl[0]

這裡選擇了讀取本地檔案,在爬蟲過程中其實不是特別方便。如果有感興趣的小夥伴,可以自己改動一下,將輸入改為流即可。

小紅書滑塊驗證爬蟲 Python滑塊驗證碼模型!

slideryolo簡介 使用方式 返回滑塊座標 在slider infer.py檔案中可以看到下面的函式 def infer config config 模型路徑 detector detector config,use gpu false,run mode fluid results detec...

python 如何用列舉法驗證6174猜想

6174猜想 對任意各位數字不相同的四位數,使用各位數字能組成的最大數減去能組成的最小數,對得到的差重複操作,最終能得到6174,並且這個操作最多不會超過7次。運用的知識點 usr bin env python3 coding utf8 import itertools s list itertoo...

python處理滑塊驗證的軌跡計算問題

在上一回中說了五行 找圖中滑塊驗證的缺口位置 python五行 解決滑塊驗證的缺口距離識別,破解滑塊驗證 本章講軌跡相關的問題。滑塊驗證核心是後台驗證軌跡引數,效驗軌跡取點的分布,正常情況是如下圖的離散分布 如果橫座標x是時間 縱座標y是位移,那麼每個點的切線就是加速度,會發現這樣的乙個規律,加速度...