今天大致上把一整個自動訂票的程式的流程都寫完了
目前的麻煩是降噪完後,過驗證的成功率還是有點低呀
不過這些之後再解決了ˊ ˋ,因為感覺這要訓練模組,會花時間....
總之先把程式碼紀錄在GitHub上吧:程式碼
演示:
然後高鐵訂票不寫啦 = =,他的驗證碼好難改
直接先找比較簡單的驗證碼來試作,所以選擇拓元演唱會的驗證碼來玩
大致上改不會花太多時間
只是他的爬圖需要用截圖的方式,若用requests把圖載下來
會因為requests.get()重新訪問網站的關係
讓整個驗證碼圖示變掉,這樣辨識上就會出錯了
所以在存圖+改圖的過程大概會改成
先截圖:
driver.save_screenshot(path)
然後擷取驗證碼的目標位置:
element = driver.find_element_by_xpath("//*[@id='yw0']")
location = element.location # 取得圖片 element 的位置
size = element.size # 取得圖片 element 的大小
left = location['x']+75 # 決定上下左右邊界
top = location['y']-370
right = location['x'] + size['width']+100
bottom = location['y'] + size['height']-350
image = Image.open(path) # 將 screen load 至 memory
image = image.crop((left,top,right,bottom)) # 根據位置剪裁圖片
image.save('captcha/captcha'+'.png', 'png') # 重新儲存圖片為 png 格式
然後轉進行圖片調色,把圖明轉暗、暗轉明,變成灰階
順便調整字的傾斜度:
img = cv2.imread('captcha/captcha.png')
imginfo = img.shape #取得圖片size的長寬 (長,寬) ,tuple型態
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #opencv的彩色轉灰階
height = imginfo[0]
width = imginfo[1]
center = (width//2,height//2) #取得圖片中心位置
M = cv2.getRotationMatrix2D(center,-5,1.0) #以中心順時鐘旋轉5度,負為順,正為逆;1.0 為縮放
gray1 = cv2.warpAffine(gray,M,(width,height)) #warpAffine為圖片旋轉或平移的式子 參數: 圖檔, 旋轉or平移參數, (長寬)
dst = np.zeros((height, width, 1), np.uint8)
for i in range(height): #顏色反轉
for j in range(width):
grayPixel = 255 - gray1[i, j]
dst[i, j] = grayPixel
cv2.imwrite('captcha/captcha_gray.png',dst) #OpenCV 圖片儲存的方法
然後用PIL 讓他變成黑白二元圖 (OpenCV其實也能做,但想2個都用用看XD)
picture = Image.open('captcha/captcha_gray.png')
gray = picture.convert('L')
table = []
threshold = 115
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
binary = gray.point(table,'1')
binary.save('captcha/captcha_binary.png')
之後就是靠tesseract大大去辨識這張圖啦
好吧.....現在還無法辨識到非常完美.....
還要經過訓練,而這部份則需再研究了= =
總之目前就先當這個月目標達成啦
之後要訓練模組的話再找時間了,這個月的專案先這樣ˊ ˋ
坑先留著Wwwwww
然後我要來看實教和地下城小說啦~
最近好少看輕小說了,結果一轉眼發現出到最新
趕快來看個~
貝爾好帥呀~~~~~~~
好啦~這個月剩餘時間來個耍廢看動漫、輕小說、電影、日劇
下個月開始,來寫遊戲和畫遊戲圖啦(ˊ w ˋ)
Unity3D和C#都快忘得差不多了,趕快來複習
然後blender........己乎全忘光orz
要來請教師父了ㄆㄆ