> 自媒体 > AI人工智能 > chatGPT真是太神了!小白也能变高手
chatGPT真是太神了!小白也能变高手
来源:AIGC爱好者
2023-06-02
313
管理

对于我一个python初学者来说,今天花了3个小时左右的时间完整搞定了图形验证码的识别功能,并且可以正常登录成功。

"MSG":"SUCCESS",

文章内容都是我和chatGPT的交流过程,内容比较长,加上代码块部分共计大约7000字(涉及网站登录,验证码自动识别以及相应的OCR工具调用等等)

先来个大招吧,直接让chapGPT输出读取图片验证码数字的代码块!

请用python3.10 写一段解析图片中数字的验证码

为了解析图片中的数字验证码,我们需要进行一些图像处理和数字识别的工作。在Python中,我们可以使用一些常见的库来完成这些任务,比如:- Pillow:一个用于图像处理的库,可以进行图像格式转换、大小调整、滤镜应用等等操作。- Tesseract:一个开源的OCR引擎,可以识别图片中的文本。- OpenCV:一个计算机视觉库,可以进行图像处理和特征提取等操作。下面是一个简单的示例代码,用于解析一张包含数字验证码的图片:from PIL import Imageimport pytesseractimport cv2# 加载图片并进行灰度化处理img = cv2.imread('captcha.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 对图片进行二值化处理thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]# 对图片进行降噪处理kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))thresh = cv2.erode(thresh, kernel, iterations=1)thresh = cv2.dilate(thresh, kernel, iterations=1)# 使用Tesseract识别图片中的数字result = pytesseract.image_to_string(Image.fromarray(thresh), config='--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789')# 输出识别结果print(result)这段代码的具体步骤如下:1. 使用OpenCV库的`cv2.imread`函数加载验证码图片,并将其转换为灰度图像。2. 对灰度图像进行二值化处理,将图片中的数字变为白色,背景变为黑色。3. 对二值化图像进行降噪处理,去除一些不必要的干扰。4. 使用Tesseract的`image_to_string`函数识别图像中的数字,并返回识别结果。需要注意的是,这段代码的效果可能会受到验证码图片质量、字体、干扰等因素的影响,因此并不能保证在所有情况下都能正确识别验证码中的数字。当我发现验证码是一个blob数据的时候,我要求chatGPT帮我修改代码逻辑,以能够正常解析blob数据

如果这个图片是一个blob数据,需要怎么处理

如果验证码图片是以blob数据的形式传入,我们可以使用Python的`io`模块将其转换为内存中的二进制数据,然后再使用Pillow的`Image`模块读取图像。下面是一个示例代码:import iofrom PIL import Imageimport pytesseractimport cv2# 假设验证码图片数据保存在名为image_blob的变量中image_data = io.BytesIO(image_blob)# 使用Pillow的Image模块读取图像img = Image.open(image_data)# 将Pillow的Image对象转换为OpenCV的numpy数组img_array = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)# 接下来的处理步骤和上一个例子中的一样gray = cv2.cvtColor(img_array, cv2.COLOR_BGR2GRAY)thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))thresh = cv2.erode(thresh, kernel, iterations=1)thresh = cv2.dilate(thresh, kernel, iterations=1)result = pytesseract.image_to_string(Image.fromarray(thresh), config='--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789')print(result)这段代码的主要变化在于,我们使用了`io.BytesIO`模块将blob数据转换为二进制数据,然后使用Pillow的`Image.open`函数读取图像。注意,由于不同的验证码图片格式可能不同,可能需要根据实际情况调整图像的颜色空间、二值化参数等。好了,到现在解析的逻辑已经有了,但是我还没有写获取验证码的代码,懒得自己写了,也是交给chatGPT吧

如果通过get请求获得的图片如何处理

import requestsfrom PIL import Imageimport pytesseractimport cv2# 假设验证码图片的URL保存在名为image_url的变量中response = requests.get(image_url)img = Image.open(io.BytesIO(response.content))# 将Pillow的Image对象转换为OpenCV的NumPy数组img_array = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)# 接下来的处理步骤和前面的例子一样gray = cv2.cvtColor(img_array, cv2.COLOR_BGR2GRAY)thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))thresh = cv2.erode(thresh, kernel, iterations=1)thresh = cv2.dilate(thresh, kernel, iterations=1)result = pytesseract.image_to_string(Image.fromarray(thresh), config='--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789')print(result)执行后发现,代码并不能正常执行,提示一个np错误,那么就继续修正吧

np的方法是哪里的

`np`指的是`NumPy`库,是Python中常用的科学计算库之一。它提供了丰富的多维数组(ndarray)对象和各种数组操作函数,是许多其他科学计算库的基础。要使用`NumPy`库,需要先安装它。可以使用以下命令来安装:pip install numpy安装完成后,在代码中可以通过`import numpy as np`来导入`NumPy`库,然后使用`np`来代替`numpy`,例如:import numpy as np# 创建一个3x3的二维数组a = np.array([[1, 2, 3], [4, 5, 6], [7,pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information 为什么会提示这个错误,pytesseract已经安装了

又遇到了新的问题,真是太难为人了,不过好在chatGPT可以帮我们分析代码,已经不用自己去搜索了

这个错误提示表明`tesseract`并没有正确地安装或配置在系统的环境变量中。`pytesseract`是一个Python的OCR库,它需要调用`tesseract`命令行工具来进行图片识别,因此需要确保`tesseract`已经正确安装,并且可以通过命令行调用。如果您已经安装了`tesseract`但仍然出现这个错误,可以尝试以下几种方法:1. 检查`tesseract`是否正确安装并添加到了系统环境变量中。可以通过在命令行输入`tesseract`来检查。2. 指定`tesseract`命令的路径,可以在调用`pytesseract.image_to_string`函数时,将`tesseract`命令的路径传递给`config`参数,例如: ```python pytesseract.image_to_string(Image.fromarray(thresh), config='--tessdata-dir /path/to/tessdata') ``` 其中`/path/to/tessdata`是`tesseract`命令所在的目录。3. 如果您是在Windows上使用`tesseract`,可能需要将`tesseract`所在的路径添加到系统的Path环境变量中。可以通过以下步骤实现: - 右键单击“此电脑”,选择“属性”,然后点击“高级系统设置”。 - 在“高级”选项卡中,点击“环境变量”。 - 在“系统变量”中找到“Path”,并点击“编辑”。 - 在弹出的对话框中,添加`tesseract`所在的路径,例如“C:Program Files (x86)Tesseract-OCR”。 - 点击“确定”保存变更。如果上述方法仍然无法解决问题,建议您参考`tesseract`的官方文档或相关的技术论坛进行进一步的调试和解决。

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 17-18

再来,继续报错,还是得找chatGPT君来协助

这个错误通常发生在Windows系统中,原因是因为在字符串中使用了反斜杠``,但是反斜杠被解释成了转义字符,导致编码错误。例如,在Windows系统中,如果要指定文件路径为`C:Usersusernamefile.txt`,可以使用以下代码:```pythonfile_path = 'C:Usersusernamefile.txt'```在这个例子中,由于反斜杠被解释成了转义字符,因此需要使用双反斜杠来表示单个反斜杠。另外,还可以使用原始字符串来避免这个问题,例如:```pythonfile_path = r'C:Usersusernamefile.txt'```在原始字符串中,反斜杠不会被解释成转义字符,因此不需要进行转义。如果您遇到了类似的编码错误,可以检查字符串中是否包含了反斜杠,并使用上述方法来避免这个问题。离成功貌似近了一步,但是还是出错了,这里是我犯的一个低级错误,明明让我配置一个目录,我写了一个完整的文件路径,这个是我的错!

# 使用Tesseract识别图片中的数字 result = pytesseract.image_to_string(Image.fromarray(thresh), config='--tessdata-dir C:xxxxxtesseract.exe --psm 10 --oem 3 -c tessedit_char_whitelist=0123456789')

在这个代码中,您指定了`tesseract.exe`的目录,但是实际上`tesseract.exe`是一个可执行文件,而不是一个目录。因此,应该将`tesseract.exe`所在的目录作为参数传递给`--tessdata-dir`选项。另外,`--tessdata-dir`选项通常用于指定`tesseract`的数据文件目录,而不是`tesseract.exe`的目录。如果您只是需要指定`tesseract.exe`的目录,可以在`config`参数中使用`--tessdata-dir`选项。因此,您可以尝试使用以下代码来指定`tesseract.exe`的目录:```pythonresult = pytesseract.image_to_string(Image.fromarray(thresh), config='--tessdata-dir "C:xxxx" --psm 10 --oem 3 -c tessedit_char_whitelist=0123456789')```在这个代码中,`--tessdata-dir`选项指定了`tesseract`的数据文件目录为`"C:xxxx"`,双引号是为了避免反斜杠被解释成转义字符。`config`参数中的其他选项是用来指定识别参数的,您可以根据需要进行修改。

问题貌似更复杂了,Traceback (most recent call last): File "xxxxxAppDataLocalPackagesPythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0LocalCachelocal-packagesPython310site-packagespytesseractpytesseract.py", line 255, in run_tesseract proc = subprocess.Popen(cmd_args, **subprocess_args()) File "C:Program FilesWindowsAppsPythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0libsubprocess.py", line 971, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "C:Program FilesWindowsAppsPythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0libsubprocess.py", line 1456, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args,FileNotFoundError: [WinError 2] 系统找不到指定的文件。During handling of the above exception, another exception occurred: return { File "xxxxxAppDataLocalPackagesPythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0LocalCachelocal-packagesPython310site-packagespytesseractpytesseract.py", line 426, in Output.STRING: lambda: run_and_get_output(*args), File "xxxxxAppDataLocalPackagesPythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0LocalCachelocal-packagesPython310site-packagespytesseractpytesseract.py", line 288, in run_and_get_output run_tesseract(**kwargs) File "xxxxxAppDataLocalPackagesPythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0LocalCachelocal-packagesPython310site-packagespytesseractpytesseract.py", line 260, in run_tesseract raise TesseractNotFoundError()pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information.

chatGPT给了我完整的解释,多次配置重试后终于,这块也搞定了

根据报错信息显示,pytesseract在运行时无法找到tesseract的安装路径或者tesseract并没有被安装在你的计算机上。你需要安装tesseract,并将其添加到你的系统PATH环境变量中。你可以按照以下步骤安装tesseract:1. 访问tesseract官方网站https://github.com/tesseract-ocr/tesseract,下载适合你的操作系统的最新版本的安装程序。2. 运行安装程序,并按照提示完成tesseract的安装。3. 在系统环境变量中添加tesseract安装目录的路径,例如“C:Program FilesTesseract-OCR”。4. 重启你的计算机并尝试重新运行你的代码。

这个错误提示是由于 pytesseract 库找不到语言数据文件(traineddata)导致的。你可以尝试以下方法进行修复:1. 首先,确认你已经安装了 Tesseract OCR 引擎,并且安装目录中包含了对应的 traineddata 文件(例如,对于英文识别,应该包含 eng.traineddata 文件)。2. 打开 cmd 窗口,执行以下命令: setx TESSDATA_PREFIX "C:Program Files (x86)Tesseract-OCRtessdata" 这里需要把 "C:Program Files (x86)Tesseract-OCRtessdata" 替换成你自己的 traineddata 文件所在的目录。3. 重新运行你的 Python 代码,看看是否还有错误提示。如果还有问题,请随时告诉我。

你需要下载 `eng.traineddata` 文件并将其放置到 `tessdata` 目录下。你可以在以下网址中下载此文件:https://github.com/tesseract-ocr/tessdata/blob/main/eng.traineddata然后,将下载的 `eng.traineddata` 文件复制到 `tessdata` 目录下。此目录的默认路径是在 Tesseract 安装文件夹下的 `tessdata` 目录。如果你不确定其位置,可以在命令行中输入以下命令:```tesseract --list-langs```它将打印出 Tesseract 可用的语言列表以及它们所在的路径。

好的,那么接下来你需要在系统环境变量中设置一个名为 `TESSDATA_PREFIX` 的变量,变量值为 tesseract 的安装路径加上 `tessdata` 子目录的完整路径,例如 `C:Program FilesTesseract-OCRtessdata`。设置完毕后,请重新启动 Python 程序,看看问题是否得到解决。

如果您已经将TESSDATA_PREFIX环境变量设置为包含Tesseract OCR的data文件夹的路径,但仍然遇到相同的问题,请确保以下事项:1. 检查路径是否正确。确保路径中的斜杠/反斜杠正确,没有任何拼写错误。2. 检查Tesseract OCR的data文件夹中是否包含正确的traineddata文件。检查文件夹路径和文件名是否正确,如果缺少traineddata文件,请下载它们并将它们放在正确的文件夹中。3. 确保您的系统具有读取权限。确保您的用户帐户可以读取TESSDATA_PREFIX文件夹和其内容。如果上述步骤都没有解决问题,您可能需要重新安装Tesseract OCR,并确保在安装过程中选择安装traineddata文件。

如果您已经设置了环境变量,并且 `tessdata` 目录中已经包含了 `eng.traineddata` 文件,但是 `pytesseract` 仍然无法找到语言数据,请尝试以下几个方法:1. 确认您使用的是正确的语言数据文件:在 `tessdata` 目录下检查是否存在其他语言的 `.traineddata` 文件,如果有,请尝试更改 `pytesseract` 的语言设置。2. 确认 `tesseract` 的版本是否正确:请检查您安装的 `tesseract` 版本是否与 `pytesseract` 兼容。可以尝试更新 `pytesseract` 或者降低 `tesseract` 的版本来解决问题。3. 确认 `tesseract` 是否正确安装:如果以上方法仍然无法解决问题,您可以尝试重新安装 `tesseract`,确保安装过程中没有出现任何错误。4. 尝试手动指定语言数据文件路径:您可以尝试手动指定语言数据文件路径,例如:```pythoncustom_config = r'--tessdata-dir "C:Program FilesTesseract-OCRtessdata"'result = pytesseract.image_to_string(Image.fromarray(thresh), config=custom_config)```这里的 `--tessdata-dir` 参数可以指定语言数据文件的路径,替换为您实际的 `tessdata` 目录路径即可。

经过一系列的倒腾后,终于可以正常运行了,但是获取的验证码是空白的啊!!!要命了

如何调整参数,现在识别不到验证码

# 对图片进行二值化处理 thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] # 对图片进行降噪处理 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) thresh = cv2.erode(thresh, kernel, iterations=1) thresh = cv2.dilate(thresh, kernel, iterations=1)调整参数可能会有一定帮助,以下是一些常见的调整方法:1. 调整阈值:可以尝试使用不同的阈值方法,例如cv2.THRESH_BINARY或cv2.THRESH_TRUNC等来进行处理。 2. 调整二值化处理时的kernel大小:可以通过调整kernel的大小来改善二值化处理的效果。一般来说,kernel越小,去噪能力越强,但也可能会导致验证码中的细节信息丢失。 3. 调整降噪处理的iterations次数:可以通过增加或减少iterations次数来调整去噪效果。 4. 调整pytesseract的参数:可以通过调整pytesseract的参数,例如psm和oem等参数,来优化验证码的识别效果。以上方法都是可以尝试的,但不一定都能够有效解决问题。你可以通过不断尝试来调整参数,看看是否能够得到更好的效果。

这个方法我试了,不太行,放弃了

然后自己琢磨了,去掉了降噪处理这部分

# 对图片进行降噪处理 #kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) #thresh = cv2.erode(thresh, kernel, iterations=1) #thresh = cv2.dilate(thresh, kernel, iterations=1)

令人振奋的时候可以获取验证码了,但是系统提示验证码不正确,呵呵,我就不行了,都到这一步了,继续捣鼓吧,

6524{"MSG":"验证码错误!","STATUS":"3000"}本来打算保存成文件对比看看的,结果在保存文件的时候 又不错了,不过这次比较简单,很直观的看到文件名多了一个n,知道问题就好办了,写个正则处理掉吧,结果。。。你知道的,小白来讲,写正则也是难事啊,刚开始就遇到问题

pattern=re.compile(r'(d )).*',re.I) result1='' if pattern.match(result): result1=pattern.match(result) print(result1)

代码直接丢给chatGPT了,来吧,解释一下

万能的chatGPT,指出别人毛病都让我觉得舒服,好吧,既然帮我修复了,我就直接拿来主义了

在你的代码中有一个小错误:`re.compile` 中的正则表达式没有闭合括号。你可以尝试以下代码来修复这个错误:```pythonimport repattern = re.compile(r'(d ).*', re.I)result1 = ''match = pattern.match(result)if match: result1 = match.group(1)print(result1)```在这里,我们使用 `group(1)` 来获取匹配到的第一个分组。同时,我们还将正则表达式的括号闭合,并使用 `match.group(1)` 来获取第一个分组的匹配结果。

看到这,一切大功告成

"MSG":"SUCCESS",

0
点赞
赏钱
0
收藏
免责声明:本文仅代表作者个人观点,与华威派无关。其原创性以及文中陈述文字和内容未经本网证实,对本文以及其中全部或者 部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
凡本网注明 “来源:XXX(非华威派)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对 其真实性负责。
如因作品内容、版权和其它问题需要同本网联系的,请在一周内进行,以便我们及时处理。
QQ:2443165046 邮箱:info@goodmaoning.com
关于作者
赶海的老阿姨(普通会员)
点击领取今天的签到奖励!
签到排行
0
0
分享
请选择要切换的马甲:

个人中心

每日签到

我的消息

内容搜索