Python蒙太奇打开OpenCV图像并记录为视频

时间:2016-02-04 10:35:30

标签: python-2.7 opencv matplotlib pyqtgraph

假设您有一个采样率为512的温度数据。我想通过与摄像机图像同步来记录这些数据。结果记录只是一个视频文件。

我可以用matplotlib和pyqtgraph绘制这些数据。

我用matplotlib做了,但视频采样率正在下降。这是带有随机传入数据的代码。

import cv2
import numpy as np
import matplotlib.pyplot as plt

cap = cv2.VideoCapture(0) # video source: webcam
fourcc = cv2.cv.CV_FOURCC(*'XVID') # record format xvid
out = cv2.VideoWriter('output.avi',fourcc, 1, (800,597)) # output video : output.avi
t = np.arange(0, 512, 1)# sample time axis from 1 to 512

while(cap.isOpened()): # record loop
    ret, frame = cap.read()# get frame from webcam
    if ret==True:
        nse = np.random.randn(len(t))# generate random data squence
        plt.subplot(1, 2, 1)# subplot random data
        plt.plot(t, nse)
        plt.subplot(1, 2, 2)# subplot image
        plt.imshow(frame)
        # save matplotlib subplot as last.png
        plt.savefig("last.png")
        plt.clf()
        img=cv2.imread("last.png") # read last.png
        out.write(img) # record last.png image to output.avi 
        cv2.imshow('frame',img)

        if cv2.waitKey(1) & 0xFF == ord('q'): # exit with press q button in frame window
            break
    else:
        break
cap.release() # relase webcam
out.release() # save video
cv2.destroyAllWindows() # close all windows

1 个答案:

答案 0 :(得分:1)

import cv2

canvas = np.zeros((480,640))

t = np.arange(0, 512, 1) # sample time axis from 1 to 512
nse = np.random.randn(len(t)) 

# some normalization to fit to canvas dimension
t = 640 * t / 512 
nse = 480 * nse / nse.max()

pts = np.vstack((t,nse)).T.astype(np.int)

cv2.polylines(canvas, [pts], False, 255)

imshow(canvas, 'gray')

这将以新的零阵列(480 x 640)创建绘图。 t和nse应按画布尺寸标准化。

如果您的捕获帧也有480,640维度,那么您可以为960x640准备cv2.VideoWriter并使用np.concatenate或np.hstack连接帧和画布以获得960x640阵列,该阵列可用作发送到VideoWriter的缓冲区。