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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:24:54