【CV】使用 matplotlib 画统计图,并用 OpenCV 显示静图和动图

1. 效果

静图


动图

2.思路

  • 准备数据
  • 使用 pyplot 画统计图
  • 图片写入流,流转图(numpy)
  • matplotlib 颜色 RGB 转 OpenCV 颜色 BRG

4. 静图

代码过程有注释,很简单的实现。注意 matplotlib RGB 转 OpenCV BGR image = image[:, :, ::-1] ,否则颜色不一致。

python 复制代码
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

"""
@Create  :   2024/01/15 16:22:44
@Author  :   Yuan Mingzhuo
"""

import cv2
import numpy as np
import math
import random

# 统计图
import io
from PIL import Image
import matplotlib.pyplot as plt


# 尺寸: 960x480
plt.figure(figsize=(9.6, 4.8))


def draw_charts():
    """
    画图
    """
    # 数据
    values = [random.random() for i in range(150)]
    # 清空
    plt.clf()
    # 线条
    plt.plot(values, linewidth=1, color="deepskyblue")
    plt.axis((0, 200, 0, 1))
    plt.axhline(y=(sum(values) / len(values)), linewidth=1, color="r")
    # 图写入流
    buffer = io.BytesIO()
    plt.savefig(buffer)
    # 流转图片
    image = Image.open(buffer)
    image = np.asarray(image)
    image = image[:, :, :3]
    # matplotlib RGB 转 OpenCV BGR
    image = image[:, :, ::-1]
    cv2.imwrite("test.jpg", image)

if __name__ == "__main__":
    draw_charts()

5. 动图

思路,更新数据时,重新绘制统计图。

  • x 轴不变,数据集 values 保持 x 轴的数量即可,自行实现;
  • x 轴变化,数据集 values 的数量变化而变化;

代码过程有注释,很简单的实现。注意 matplotlib RGB 转 OpenCV BGR image = image[:, :, ::-1] ,否则颜色不一致。

python 复制代码
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

"""
@Create  :   2024/01/15 16:22:44
@Author  :   Yuan Mingzhuo
"""

import cv2
import numpy as np
import math
import random

# 统计图
import io
from PIL import Image
import matplotlib.pyplot as plt


# 尺寸: 960x480
plt.figure(figsize=(9.6, 4.8))


def draw_chart(values):
    """
    画图
    """
    buffer = io.BytesIO()
    # 清空
    plt.clf()
    plt.plot(values, linewidth=1, color="deepskyblue")
    axis_x = math.ceil(len(values) / 100) * 100
    plt.axis((0, axis_x, 0, 200))
    plt.axhline(y=(sum(values) / len(values)), linewidth=1, color="r")
    plt.savefig(buffer)
    # 获取图
    image = Image.open(buffer)
    image = np.asarray(image)
    image = image[:, :, :3]
    # matplotlib RGB 转 OpenCV BGR
    image = image[:, :, ::-1]
    # print(image.shape)
    # cv2.imwrite("test.jpg", image)
    return image

if __name__ == "__main__":
    # 数据
    values = []
    for i in range(1800):
        # 更新数据
        values.append(random.random() * 180)
        # 重新画图
        image = draw_chart(values)
        # 显示
        cv2.imshow("test", image)
        cv2.waitKey(100)

6. 多图

效果

代码

python 复制代码
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

"""
@Create  :   2024/01/15 16:22:44
@Author  :   Yuan Mingzhuo
"""

import cv2
import numpy as np
import math
import random

# 统计图
import io
from PIL import Image
import matplotlib.pyplot as plt


# 尺寸: 960x480
plt.figure(figsize=(9.6, 4.8))


def draw_charts():
    """
    画图
    """
    # 数据
    values_a = [random.random() for i in range(150)]
    values_b = [random.random() for i in range(150)]
    values = [values_a, values_b]
    # 清空
    plt.clf()
    # 线条
    for value in values:
        plt.plot(value, linewidth=1)
    # 坐标轴
    plt.axis((0, 200, 0, 1))
    # 辅助线
    plt.axhline(y=0.5, linewidth=1, color="r")
    # 图写入流
    buffer = io.BytesIO()
    plt.savefig(buffer)
    # 流转图片
    image = Image.open(buffer)
    image = np.asarray(image)
    image = image[:, :, :3]
    # matplotlib RGB 转 OpenCV BGR
    image = image[:, :, ::-1]
    cv2.imwrite("test.jpg", image)
  

if __name__ == "__main__":
    draw_charts()

7.应用

视觉计算时,可直接显示变化过程,减少先保存数据再绘制图的过程

相关推荐
恋猫de小郭1 小时前
AI 正在造就你的「认知卸载」,但是时代如此
前端·人工智能·ai编程
飞哥数智坊9 小时前
我的“龙虾”罢工了!正好对比下GLM、MiniMax、Kimi 3家谁更香
人工智能
风象南10 小时前
很多人说,AI 让技术平权了,小白也能乱杀老师傅 ?
人工智能·后端
董董灿是个攻城狮11 小时前
大模型连载1:了解 Token
人工智能
RoyLin14 小时前
沉睡三十年的标准:HTTP 402、生成式 UI 与智能体原生软件的时代
人工智能
needn16 小时前
TRAE为什么要发布SOLO版本?
人工智能·ai编程
毅航16 小时前
自然语言处理发展史:从规则、统计到深度学习
人工智能·后端
前端付豪16 小时前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
ursazoo16 小时前
写了一份 7000字指南,让 AI 帮我消化每天的信息流
人工智能·开源·github
_志哥_20 小时前
Superpowers 技术指南:让 AI 编程助手拥有超能力
人工智能·ai编程·测试