点赞 + 关注 + 收藏 = 学会了

前面介绍过在 OpenCV 里可以通过 cv2.imread 读取本地图片,但这个方法无法读取网络图片。

读取网络图片:cv2.imdecode

在 OpenCV 里读取网络图片需要使用 cv2.imdecode 这个方法,它可以直接处理字节流(如网络传输的图像、摄像头帧)而无需先保存为文件。

语法:

image = cv2.imdecode(buf, flags)
  • buf:必须是 numpy.ndarray 类型,通常通过 np.frombuffer() 将字节数据转换而来。该 NumPy 数组的 dtype (数据类型) 必须是 np.uint8 。这是因为图像的编码数据本质上是一串字节流,每个字节的值范围是0到255,这恰好对应了8位无符号整数 ( uint8) 的表示范围 。
  • flags:可选参数,指定解码方式(与 cv2.imreadflags 相同)。是一个整数,它像一个指令开关,告诉 imdecode 函数我们希望以何种方式来解码这张图片 。这个参数决定了输出图像的颜色模式、是否保留透明通道等。

以下是几个最常用、也最重要的 flags 值:

标志常量 整数值 描述
cv2.IMREAD_COLOR 1 (默认值) 将图像解码为三通道的BGR彩色图像。如果原始图像有Alpha(透明)通道,它将被忽略并移除 。这是最常用的模式。
cv2.IMREAD_GRAYSCALE 0 将图像解码为单通道的灰度图像 。即使原始图像是彩色的,也会被转换为灰度图。这在很多不需要颜色信息的场景(如边缘检测)中非常有用。
cv2.IMREAD_UNCHANGED -1 按原样加载图像。这是功能最全的模式,它会保留图像的所有通道,包括Alpha(透明)通道 。如果你需要处理带透明背景的PNG图片,就必须使用这个标志 。
cv2.IMREAD_ANYCOLOR 4 以任意可能的颜色格式读取图像 。

举个例子

# 导入OpenCV库,用于图像处理和显示
import cv2
# 导入NumPy库,用于数组操作
import numpy as np
# 导入SSL库,用于处理HTTPS请求
import ssl # 主程序入口,确保该代码块仅在直接运行脚本时执行
if __name__ == '__main__':
# 导入urllib.request模块并简化为request别名,用于网络请求
import urllib.request as request
# 设置请求头,模拟Chrome浏览器访问,避免被服务器拒绝
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"}
# 创建请求对象,包含图片URL和请求头
req = request.Request("https://p9-passport.byteacctimg.com/img/user-avatar/6c49bd0b908f5b1601050a168d0283b2~60x60.awebp", headers=headers)
# 创建未经验证的SSL上下文,解决HTTPS证书验证问题
context = ssl._create_unverified_context()
# 发送请求并获取响应,使用SSL上下文避免证书错误
response = request.urlopen(req, context=context)
# 读取响应内容,转换为字节数组,再转为NumPy数组,最后解码为OpenCV图像
imgUrl = cv2.imdecode(np.array(bytearray(response.read()), dtype=np.uint8), -1)
# 创建窗口显示图片,窗口标题为"imgUrl"
cv2.imshow("imgUrl", imgUrl)
# 等待用户按键输入,0表示无限等待
key = cv2.waitKey(0)
# 判断用户是否按下'q'键
if key == ord("q"):
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

在这个例子中,通过 request 发起请求,模拟了浏览器请求,获取我在掘金的头像图片。

然后用 cv2.imdecode 方法加载我的头像。

最后通过 cv2.waitKey(0) 让图片一直展示,直至按下 q 键才关闭图片窗口。

为何需要 cv2.imreadcv2.imdecode 两个API?

cv2.imreadcv2.imdecode似乎在做同样的事情——将某种格式的数据变成OpenCV可以处理的图像矩阵。那么,为什么需要两个独立的函数呢?这并非冗余设计,而是体现了软件工程中一个极其重要的原则:单一职责原则(Single Responsibility Principle, SRP)。这个原则指出,一个类或一个模块应该有且只有一个引起它变化的原因。换句话说,一个函数应该只做一件事,并把它做好。

更直观地总结两者的区别,总结了一个表格:

特性 cv2.imread cv2.imdecode
主要使用场景 从本地文件路径加载图像。 从内存中的字节缓冲区解码图像。
输入参数类型 string (文件路径) numpy.ndarray (一维, dtype=np.uint8)
承担的职责 文件I/O 2. 图像解码 图像解码
抽象级别 高层 (便利的封装函数) 底层 (核心解码引擎)
灵活性 局限于本地文件系统。 高度灵活,可处理来自任何来源的数据。

以上就是本文的全部内容了,想了解更多 OpenCV Python 的工友欢迎关注 《OpenCV Python 中文教程》

点赞 + 关注 + 收藏 = 学会了

『OpenCV-Python』加载网络图片的更多相关文章

  1. 1、OpenCV Python 图像加载和保存

    __author__ = "WSX" import cv2 as cv # 这里的文件是图片或者视频 def Save_File( image ): cv.imwrite(&quo ...

  2. Opencv加载网络图片

    opencv加载网络图片 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; usin ...

  3. 【WPF】wpf image控件加载网络图片不显示问题,

    1.加载网络图片到内存system.drawing.image对象中2.内存中的image 转Bitmap 再转适合system.windows.controls.image 的BitmapImage ...

  4. 有关DTCoreText无法加载网络图片及应用问题

    至于DTCoreText是干嘛的,不清楚的同学自行网上脑补,这就不啰嗦了,只说一下其用法. 里面有三种控件供大家使用,DTAttributedTextView, DTAttributedLabel 和 ...

  5. [原创]cocos2dx加载网络图片&异步加载图片

    [动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到 ...

  6. python 模块加载

    python 模块加载 本文主要介绍python模块加载的过程. module的组成 所有的module都是由对象和对象之间的关系组成. type和object python中所有的东西都是对象,分为 ...

  7. SDWebImage 加载网络图片失败,重新运行,就能加载成功。

    现象: 使用SDWebImage 加载网络图片,偶尔会有一两张图片就是显示不出来.重新运行有时又可以了. 这个问题的原因是: 当SDWebImage 在加载图片的时候 我用的是- (void)sd_s ...

  8. Android Volley入门到精通:使用Volley加载网络图片

    在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完 ...

  9. Android三种基本的加载网络图片方式(转)

    Android三种基本的加载网络图片方式,包括普通加载网络方式.用ImageLoader加载图片.用Volley加载图片. 1. [代码]普通加载网络方式 ? 1 2 3 4 5 6 7 8 9 10 ...

  10. 仿微信朋友圈图片查看-glide加载网络图片,photoview 实现缩放

    http://www.cnblogs.com/csonezp/p/5083286.html 这里实现的效果就和微信朋友圈点击图片后查看大图一样,如果你不清楚是什么效果,可以拿出手机,打开朋友圈,找到一 ...

随机推荐

  1. Flutter适配HarmonyOS 5开发知识地图

    还在为Flutter适配HarmonyOS 5头疼?这份知识地图,用实战解析+高频避坑指南,帮你快速打通跨平台开发任督二脉! ▌为什么这份资源值得你收藏? 分层进阶:从环境搭建→插件开发→性能优化,匹 ...

  2. C#开发的Panel滚动分页控件 - 开源研究系列文章

    前些时候因为想拥有一个自己的软件快捷打开软件,于是参考Windows 11的开始菜单,进行了编写这个应用软件,里面有一个功能就是对显示的Panel里的应用对象的分页功能,于是就想写一个对Panel的自 ...

  3. Seata源码—4.全局事务拦截与开启事务处理

    大纲 1.Seata Server的启动入口的源码 2.Seata Server的网络服务器启动的源码 3.全局事务拦截器的核心变量 4.全局事务拦截器的初始化源码 5.全局事务拦截器的AOP切面拦截 ...

  4. TenantLineInnerInterceptor源码解读

    一.引言 TenantLineInnerInterceptor是MyBatis-Plus中的一个拦截器类,位于com.baomidou.mybatisplus.extension.plugins.in ...

  5. .NET周刊【5月第3期 2025-05-18】

    国内文章 理解 C# 中的各类指针 https://www.cnblogs.com/eventhorizon/p/18873400 本文介绍了C#中的各种指针,包括对象引用.指针.IntPtr.函数指 ...

  6. 鸿蒙运动开发实战:打造 Keep 式轨迹播放效果

    前言 在运动类应用中,轨迹播放效果是提升用户体验的关键功能之一.它不仅能直观展示用户的运动路线,还能通过动态效果增强运动的趣味性.Keep 作为一款知名的运动健身应用,其轨迹播放效果深受用户喜爱.那么 ...

  7. 浅析领域驱动模型VO、DTO、BO、PO 等的概念、区别及其用法

    摘要:浅析POJO.DTO.DO.VO.BO.PO和Entity等的概念.区别及其用法. 名词解释   领域模型中的实体类分为四种模型:VO.DTO.DO和PO,各种实体类用于不同业务层次间的交互,并 ...

  8. Innosetup 安装 VC_redist 运行时库

    #普通安装vc_redis.x86.exe(会提示用户做出选择),在innosetup的[Run]属性中添加下面这一行 Filename: "{app}VC_redist.x86.exe&q ...

  9. C# 模式匹配全解:原理、用法与易错点

    引言 随着C#不断发展,"模式匹配"(Pattern Matching)已经成为让代码更加友好.可读和强大的核心特性.从 C# 7.0 初次引入,到 C# 11的能力扩展,模式匹配 ...

  10. Springboot笔记<7>过滤器与拦截器

    过滤器 拦截器 过滤器 过滤器拦截的是URL Spring中自定义过滤器(Filter)一般只有一个方法,返回值是void,当请求到达web容器时,会探测当前请求地址是否配置有过滤器,有则调用该过滤器 ...