2016-02-04 87 views
0

假設您有一個採樣率爲512的溫度數據。我想通過與相機圖像同步來記錄這些數據。結果記錄將只是一個視頻文件。Python蒙太奇在OpenCV圖像上繪製一張圖並記錄爲視頻

我可以用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 
+0

也許磁盤I/O正在減慢循環。我做類似的東西,但我不會使用matplotlib,而是使用cv2.line,cv2.polylines等直接在numpy數組圖像數據(零或幀)上繪製圖形,然後我們可以將該numpy緩衝區發送給cv2.VideoWriter,就像你在做。 – otterb

+0

你可以分享繪製numpy數組的opencv繪圖函數嗎?我需要看到價值觀和變化。 opencv繪圖函數足夠了嗎? – acs

+0

如果你可以得到所有點的x,y座標(t,nse),那麼你可以使用'cv2.polylines'在numpy數組上繪製它http://docs.opencv.org/2.4/modules/core/ doc/drawing_functions.html#多義線 – otterb

回答

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 * 640)創建的情節。 t和nse應該按照畫布尺寸標準化。

如果您的捕捉幀也有480,640維度,那麼您可以爲960x640準備cv2.VideoWriter,並使用np.concatenate或np.hstack連接幀和畫布,以使960x640陣列可用作發送到VideoWriter的緩衝區。

相關問題