识别码用到二值化

#-*- coding:UTF-8 -*-


# 面试问题: 写自动化脚本的时候遇到验证码你这么处理

# 1: 验证码有的是前端生成的,有的是后台生成以后,返给前端的,
# 2: 让后台把验证码写成万能验证码,这样无论我们提交啥验证码都能通过,但是这个验证码想当于没有
# 3: 让前端把验证码注释掉,但是大部分开发不给注释,所以我们需要第三种方式
# 4: 自己通过第三方库区识别验证码,这样验证码的识别率差不多有90%,总有几个要失败的

# 首先我们需要去网站在登陆的时候讲验证码下载到本地,再通过第三方库区识别

# 导入 selenium 包,打开浏览器
from selenium import webdriver

# 导入休眠包
import time

# 导入base64 包
import base64

# 首先倒包 导入 PIL 下面的 IMAGE 用来打开图片
from PIL import Image
# 导入识别图片验证码的包
from pytesseract import *

import PIL.ImageOps


# 打开浏览器
driver = webdriver.Firefox()

# 设置窗口最大化
driver.maximize_window()

# 打开指定网页
driver.get("http://www.qiezzi.com/user/signup?return=http://www.qiezzi.com/")

# 设置休眠时间
time.sleep(5)

# 查找控件,获取下载验证码的URL

ing_down = driver.find_element_by_class_name("ing_down")

# 通过 属性获取url

img_url = ing_down.get_attribute("src")

print img_url

# 对字符串进行切换 1:获取图片的格式 2: 切换出base64,将其转化为一张图,保存下来

formats = "."+ img_url[11:15]

if formats == '.jpeg':

    formats = ".jpg"

print formats

# 切换 base64 图片同时保存下来到本地

base64imaage = img_url.split(",")

# 通过下标去取第二个

base64_img = base64imaage[1]

print base64_img

# 将图片保存到本地

files = "qiezi"+formats

# 指定读写方式
filename = open(files,"wb")


# 写入内容
# 对base64 进行解码以及写入
imagedata = base64.b64decode(base64_img)

# 写入本地
filename.write(imagedata)

# 关流
filename.close()


# 开始识别验证码



def initTable(threshold=170):
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    return table


# 打开图片
im = Image.open(files)

# 指定图片的大小

# 对图片进行二值化处理
# 一张图片可以处理成两种颜色,就是黑色和白色处理的模式叫 L
# L = R * 299/1000 + G * 587/1000 + B * 114/1000
im = im.convert('L')
# 如果现在取识别,咱们这个图是识别不出来的,因为每一种类型的图片阈值是不一样的,默认情况下二值化的阈值是127
# 所以我们去从新设置模式,改变阈值
# 设置模式1 模式
binaryImage = im.point(initTable(), '1')

# 设置为 L模式 二值化模式
im1 = binaryImage.convert('L')

# 对图片进行校准
im2 = PIL.ImageOps.invert(im1)
# 校准完了以后设置为模式1
im3 = im2.convert('1')
# 继续设置为黑吧图像
im4 = im3.convert('L')

# 指定图片的大小
#将图片中字符裁剪保留 左 下 右 上 边距
box = (15,0,85,28)
# 设置图片的大小
region = im4.crop(box)
#将图片字符放大
out = region.resize((120,38))

# 讲图片识别出来
asd = pytesseract.image_to_string(out)

print asd
print (out.show())

# 关闭
driver.quit()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCVSharp 是一个绑定 C++ 开源计算机视觉库 OpenCV 到 .NET 的桥接库,在条形码识别上有着优异表现。使用 OpenCVSharp,我们可以方便地在 C# 或其他 .NET 语言中使用 OpenCV 的功能。 条形码识别是计算机视觉领域的基础应用之一,它可以通过解析条形码上的数据信息,实现对商品、物流、医疗、超市等领域的数据追踪和溯源。在 OpenCVSharp 中,常用的条形码识别算法包括 Zbar、ZXing 等。 Zbar 基于 C++ 实现,具有速度快、准确率高、稳定性好的特点。在 OpenCVSharp 中,可以通过 Nuget 安装 ZbarSharp 包来使用 Zbar 条码识别算法。ZXing 则是一款基于 Java 的条码识别框架,同样也可以在 OpenCVSharp 中使用。 在具体的实现中,可以通过 OpenCVSharp 中的 cv::imread 函数从图片或视频流中读取图像数据,然后利用 Zbar 或 ZXing 等算法对条形码进行解析和识别。解析出的数据可以直接传递到后端数据处理系统进行处理和处理。 总之,使用 OpenCVSharp 进行条形码识别可以使开发人员在 .NET 平台上快速实现条形码识别功能,满足不同场景下的需求。 ### 回答2: OpenCVSharp是一个开源的计算机视觉库,它可以帮助我们实现图像处理和分析相关的算法。而条码识别作为计算机视觉的一个重要应用领域之一,OpenCVSharp也可以帮助我们实现。 要实现条码识别,我们需要用到OpenCVSharp中的图像处理函数和算法,实现以下基本步骤: 第一步,读取图像。我们可以使用OpenCVSharp中的cv::imread函数加载待处理的图像,得到一个图像矩阵。 第二步,灰度化。条码识别的算法通常会先将图像转为灰度图进行处理。我们可以使用cv::cvtColor函数将彩色图像转为灰度图。 第三步,二值化。将灰度图转为二值图,可以帮助我们更好地区分条码的条和空。可以使用OpenCVSharp中的cv::threshold函数对灰度图进行阈值化处理。 第四步,条码检测。我们可以使用OpenCVSharp中的cv::findContours函数进行轮廓检测,找出图像中潜在的条码轮廓。 第五步,条码解码。通过条码解码算法,可以将条码的内容从条码图像中提取出来。常用的条码解码算法有ZXing和ZBar等。在OpenCVSharp中,我们可以使用ZXingSharp库来实现条码识别。 最后,将识别结果输出或者进行其他后续处理。可能需要对识别结果进行格式转换,比如将读取到的条码数据转为字符串类型。 总的来说,OpenCVSharp可以帮助我们快速实现条码识别功能,为开发实用的计算机视觉应用提供了强大的支持。 ### 回答3: OpenCvSharp是一个基于OpenCV库的跨平台图像处理库,可以用于实现图像处理和计算机视觉算法。在OpenCvSharp中,可以使用ZBar库或ZXing库进行条码识别。 使用ZBar库识别条码的步骤如下: 1. 使用ZBar的C#绑定(ZBarSharp库)添加对ZBar库的引用。 2. 加载待识别的图像。 3. 创建ZBar二维码/条码扫描器的实例。 4. 扫描图像并获取扫描结果。 5. 处理扫描结果,获取条码值和类型。 使用ZXing库识别条码的步骤如下: 1. 使用ZXing的C#绑定(ZXing.Net库)添加对ZXing库的引用。 2. 加载待识别的图像。 3. 创建ZXing的条码阅读器的实例。 4. 将图像传递给条码阅读器进行扫描。 5. 处理扫描结果,获取条码值和类型。 需要注意的是,条码识别的精度和速度都与算法实现的质量和硬件性能有关。在实际应用中,可以根据具体需求和情况选择适合的算法和硬件设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值