如何将CV2捕获的在线MJPG流图像转为Pillow格式并统计颜色?
正确将OpenCV捕获的MJPG流图像转为Pillow格式并统计颜色的方法
错误原因
你代码里的核心问题是重复且错误地处理图像:已经通过Image.fromarray(img_cv2)得到了合法的Pillow图像对象img_pil,但后续又错误调用Image.open(img_cv2)——Image.open()的参数只能是文件路径、文件流或字节数据,不能直接传入numpy数组,这就是触发AttributeError的原因。
修正后的完整代码
import cv2 from PIL import Image import numpy as np # 替换为你的MJPG流地址 url = "http://link-to-the-online-MJPG-streamer/mjpg/video.mjpg" # 初始化视频捕获 cap = cv2.VideoCapture(url) # 检查流是否成功打开 if not cap.isOpened(): print("无法打开MJPG流") exit() # 读取一帧图像 ret, original_image = cap.read() # 检查是否成功读取帧 if not ret: print("无法从流中读取图像") cap.release() exit() # 1. OpenCV转Pillow的正确步骤 # OpenCV默认颜色空间是BGR,转换为Pillow使用的RGB img_rgb = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB) # 将numpy数组转换为Pillow Image对象 img_pil = Image.fromarray(img_rgb) # 2. 统计图像颜色 # 将Pillow图像转为numpy数组(也可直接使用之前的img_rgb) img_np = np.array(img_pil) # 重塑为二维数组(每行代表一个像素的RGB值),统计唯一颜色及出现次数 colours, counts = np.unique(img_np.reshape(-1, 3), axis=0, return_counts=True) # 输出颜色总数 print(f"图像中共有{len(counts)}种不同颜色") # 释放资源 cap.release()
关键说明
- OpenCV转Pillow的核心操作:
Image.fromarray()是将numpy数组(OpenCV返回的图像格式)转换为Pillow Image对象的标准方法,无需额外调用Image.open()。 - 颜色空间转换:必须将OpenCV的BGR格式转为RGB,否则Pillow显示和处理的颜色会失真。
- 资源释放:完成操作后要调用
cap.release()释放视频捕获资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Mark K
相关产品推荐
相关产品推荐

