如何通过URL爬取图片并解决OpenCV imwrite的!_img.empty()报错问题
错误原因
这个OpenCV报错的核心是调用cv2.imwrite时传入的图片对象为空,说明前置步骤cv2.imdecode解码失败,返回了None值。
你代码中的错误来自多余的base64解码操作:requests.get请求图片URL返回的res.content本身就是JPG格式的原始二进制数据,不需要用base64.b64decode处理,对原始二进制做base64解码只会生成无效乱码,自然无法被OpenCV识别为合法图片。
修复方案
直接删除多余的base64解码步骤,用原始请求返回的二进制内容转numpy数组即可。额外可以增加解码成功判断、请求状态判断,避免异常场景下的报错。如果你需要保留多张图片不被覆盖,可以把保存的文件名改为循环变量i对应的名称。
修正后的完整代码
import sys import requests import time import numpy as np import cv2 url='https://thispersondoesnotexist.com/image' headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} imgs = {} for i in range(1,10): res = requests.get(url, timeout=60, headers=headers) # 先判断请求是否成功 if res.status_code != 200: print(f"第{i}次请求失败,状态码:{res.status_code}") time.sleep(5) continue imgs[i] = res.content # 直接用原始二进制内容转numpy数组,删除base64解码步骤 jpg_as_np = np.frombuffer(res.content, dtype=np.uint8) img = cv2.imdecode(jpg_as_np, flags=1) # 判断图片解码是否成功 if img is not None: # 按序号命名避免覆盖,不需要可改回'./0.jpg' cv2.imwrite(f'./{i}.jpg', img) else: print(f"第{i}次请求的图片解码失败") time.sleep(5)
内容的提问来源于stack exchange,提问作者keerthana
相关产品推荐
相关产品推荐

