Click here to Skip to main content
15,884,388 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
Train
Python
import cv2
import numpy as np
from datetime import datetime
import os
from PIL import Image
import hashlib, os, math, time
import Image
#from PIL import Image
import ImageEnhance
from pytesser import *
from urllib import urlretrieve
import math
import random
import glob
iconset = ['0','0','0','3','3','3','3','3','3','3','3','5','5','5','5','7','7',
'7','7','7','7','7','7','7','4','4','4','4','4','4','4','4','2','2','2','2','2','2','2','2','2','2']
iconset = [0,1,20,5,6,7,8,10,11,15,17,2,12,21,22,3,4,
13,14,16,18,19,23,9,24,25,26,27,28,29,30,31,32,
33,34,35,36,37,38,39,40,41]
samples=np.empty((0,100))
responses =[]
for f in range(filen):
    img =Image.open('./iconset/'+str(f)+'.gif')
    img.convert('RGB').save ('img.jpg','JPEG')
    img= cv2.imread('img.jpg')
    im3= img.copy()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret,thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    fg = cv2.erode(thresh,None,iterations = 2)
    bgt = cv2.dilate(thresh,None,iterations = 3)
    ret,bg = cv2.threshold(bgt,1,128,1)
    marker = cv2.add(fg,bg)
    marker32 = np.int32(marker)
    cv2.watershed(img,marker32)
    m = cv2.convertScaleAbs(marker32)
    ret,thresh = cv2.threshold(m,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    roismall = cv2.resize(thresh,(10,10))
    sample = roismall.reshape((1,100))
    samples = np.append(samples,sample,0)
    responses.append(iconset[f])
responses = np.array(responses,np.float32)
responses = responses.reshape((responses.size,1))
print "training complete"
np.savetxt('general-samples.data',samples)
np.savetxt('general-responses.data',responses)
def train():
    samples = np.loadtxt('general-samples.data',np.float32)
    responses = np.loadtxt('general-responses.data',np.float32)
    responses = responses.reshape((1,responses.size))
    model = cv2.KNearest()
    model.train(samples,responses)
    return model

breaking-captcha:
Python
import cv2
import numpy as np
samples = np.loadtxt('general-samples.data', np.float32)
responses = np.loadtxt('general-responses.data', np.float32)
responses = responses.reshape((responses.size,1))
model = cv2.KNearest()
model.train(samples, responses)

image = cv2.imread('captcha1.png')
out = np.zeros(image.shape, np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
fg = cv2.erode(thresh,None,iterations = 2)
bgt = cv2.dilate(thresh,None,iterations = 3)
ret,bg = cv2.threshold(bgt,1,128,1)
marker = cv2.add(fg,bg)
marker32 = np.int32(marker)
cv2.watershed(image,marker32)
m = cv2.convertScaleAbs(marker32)
ret,thresh = cv2.threshold(m,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
res = cv2.bitwise_and(image,image,mask = thresh)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST
        , cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
    if cv2.contourArea(contour) > 50:
        [x, y, w, h] = cv2.boundingRect(contour)
        if  h > 28:
            cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
            roi = thresh[y:y+h, x:x+w]
            roi_small = cv2.resize(roi,(10,10))
            roi_small = roi_small.reshape((1,100))
            roi_small = np.float32(roi_small)
            retval, results, neigh_resp, dists = model.find_nearest(roi_small
                    , k = 1)
            string = str(int((results[0][0])))
            cv2.putText(out, string, (x, y+h), 0, 1, (0, 255, 0))
cv2.imshow('im',image)
cv2.imshow('out',out)
cv2.waitKey(0)
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900