You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:24:03