OpenCV无法从URL读取图片,imshow报错(-215:Assertion failed)求助
解决OpenCV imshow报错(-215:Assertion failed)的问题
问题分析
你遇到的(-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'错误,本质是img变量为None——程序没能成功从URL加载图片,核心原因有两个:
- OpenCV的
cv2.imdecode不支持SVG矢量图格式,你请求的是SVG图片,无法被解码为有效的图像矩阵 url_to_image函数缺少错误处理和合法请求头,可能被服务器拦截;同时getColor函数存在缩进逻辑错误
修复方案
1. 替换为支持的图片格式
将SVG URL替换为对应的位图格式(如PNG/JPG),比如维基媒体提供的SVG缩略图PNG版本:
img = url_to_image("https://upload.wikimedia.org/wikipedia/commons/thumb/2/24/Solid_purple.svg/200px-Solid_purple.svg.png")
2. 优化URL图片获取函数
添加请求头避免被服务器拒绝,同时增加错误捕获逻辑:
def url_to_image(url): # 设置合法User-Agent,模拟浏览器请求 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} req = urllib.request.Request(url, headers=headers) try: resp = urllib.request.urlopen(req) image = np.asarray(bytearray(resp.read()), dtype='uint8') image = cv2.imdecode(image, cv2.IMREAD_COLOR) if image is None: raise ValueError("图片格式不支持,无法解码") return image except Exception as e: print(f"加载图片出错: {str(e)}") return None
3. 修复颜色匹配函数的逻辑错误
getColor函数中return语句缩进错误,导致第一次循环就返回结果,修正后:
def getColor(R,G,B): minimum = 10000 color_name = "" for i in range(len(csv)): distance = abs(R-int(csv.loc[i, 'R'])) + abs(G-int(csv.loc[i, 'G'])) + abs(B-int(csv.loc[i,'B'])) if distance <= minimum: minimum = distance color_name = csv.loc[i, 'color_name'] return color_name # 放在循环外部,遍历所有颜色后返回最匹配的结果
4. 增加图片有效性判断
在调用imshow前检查图片是否加载成功:
img = url_to_image("https://upload.wikimedia.org/wikipedia/commons/thumb/2/24/Solid_purple.svg/200px-Solid_purple.svg.png") if img is not None: cv2.imshow("image", img) cv2.waitKey(0) cv2.destroyAllWindows() # 释放窗口资源 else: print("图片加载失败,请检查URL或网络连接")
内容的提问来源于stack exchange,提问作者Nighttwinkle
相关产品推荐
相关产品推荐

