?
最开始的识别思路是通过模板来找到这个验证码的滑块图像所在的位置,但是使用下来发现准确率在90%左右一起提不上去,无论怎么优化都无法提高,后来发现了一个奇特的思路可用完美解决这个验证码的问题,思路写在了代码里面,最后返回的结果是需要移动的滑块的左上角的坐标点位置(本算法思路主要用在电子税务网站)其他的类似的验证码也可以
识别结果示意图
def slide_comparison( target_bytes):
# ; 微 394467238
alpha_channel = np.ones(target_bytes.shape, dtype=target_bytes.dtype) * 255
# alpha通道每个像素点区间为[0,255], 0为完全透明,255是完全不透明
# image = ImageChops.difference(background, target)
# image = ImageChops.difference(alpha_channel, target_bytes)
image = alpha_channel - target_bytes
# background.close()
# target.close()
# image = image.point(lambda x: 255 if x > 20 else 0)
start_y = 0
start_x = 0
# for i in range(0, image.width):
for i in range(0, image.shape[1]):
count = 0
# for j in range(0, image.height):
for j in range(0, image.shape[0]):
# pixel = image.getpixel((i, j))
pixel = image[j, i]
# if pixel != (0, 0, 0):
if pixel != 0:
count += 1
if count >= 5 and start_y == 0:
start_y = j - 5
if count >= 5:
start_x = i + 2
break
return [start_x, start_y] # w,h
def get_long_v2(finame='0.png',pre=''):
# v2 版本;仅仅使用png 的遮罩层就可以得到滑块的位置了; 微 394467238
print(finame)
bg_img0 = cv2.imread(finame, cv2.IMREAD_UNCHANGED)
res = slide_comparison(bg_img0[:,:,3]) # 左上角点的坐标 w,h
# th, tw = bg_img0.shape[:2]
# br = (res[0] + tw, res[1] + th)
# cv2.rectangle(bg_img0, res, br, (255, 255, 255), 2) # 绘制矩形
# cv2.imwrite('1.png', bg_img0) # 保存在本地
return res