用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()函数,在我这里这个是没有效果的。

实现效果

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

猜你喜欢

转载自blog.csdn.net/weixin_43945848/article/details/123706099