用opencv-python和matplotlib实现视频的颜色直方图的动态显示

简介

对于一张图片可以计算它的颜色直方图,对于一个视频可以逐帧计算每一帧的颜色直方图,最近做一个东西需要对视频进行直方图提取,但ffmpeg的命令只能将直方图打印在视频上,也不能导出直方图的数据,所以只能另辟蹊径自己手动写一个。

环境

vscode(配置好了anaconda的python路径)。
opencv-python库
matplotlib库

代码

import cv2
import matplotlib.pyplot as plt
plt.ion() #开启动态绘图
plt.figure() #建立图窗
cap = cv2.VideoCapture('I(720p).avi')  #调用本地文件,如果为0则调成实时摄像头
while(True):
    plt.clf() #清屏,如果不清则会无限叠加之前的作图
    ret, frame = cap.read() #ret为True or False,frame为读取的每帧图像的数组
    if ret == False:
        break; #帧读取完的时候ret就会从True变成False
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #进行灰度处理
    cv2.imshow('Grayscale', gray) #展示视频图像
    hist = cv2.calcHist([gray],[0],None,[256],[0,256]) #计算直方图
    plt.plot(hist)  #作图
    plt.draw()      #绘图展现
    cv2.waitKey(1)  #等待1ms 可替换成plt.pause()
cap.release()

19行的极简代码,可以自行扩展,总的来说就是把图像一帧一帧的读入,然后用cv2.calcHist函数来计算直方图,分箱数为256,对应0-255个像素值,返回的是hist数组,需要使用plt.plot进行绘图,同时此处也可以写代码将它导出进行后续处理。
碰见最大的问题是动态显示,请自行测试环境,我是直接运行py文件表示没有问题,如果是jupyter notebook那种环境可能需要figure.canvas.draw()函数,在我这里这个是没有效果的。

实现效果

在这里插入图片描述
图片过大已裁剪。需自行调整窗口大小。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值