我正在嘗試打開一個視頻,讀入一個幀,在其上繪制資料曲線,然后將該幀保存到視頻檔案中。輸入檔案是來自各種相機的 *.MOV 格式,我真的很想避免在此之前轉換它們。
import numpy
import cv2
import matplotlib.pyplot as plt
cap = cv2.VideoCapture(filename)
print(cap.isOpened())
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
fig = plt.figure()
fig.subplots_adjust(0,0,1,1)
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
fig.canvas.draw()
out = cv2.VideoWriter(filename.replace('.','splined.'),fourcc, fps, fig.canvas.get_width_height()[::-1])
plt.close(fig)
for x in range(Startframe, Stopframe):
print(x)
cap.set(cv2.CAP_PROP_POS_FRAMES,x)
a,img=cap.read(0)
fig = plt.figure()
fig.subplots_adjust(0,0,1,1)
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.plot(TimeSplines[1,:,x-Startframe],TimeSplines[0,:,x-Startframe])
fig.canvas.draw()
img2 = numpy.fromstring(fig.canvas.tostring_rgb(), dtype=numpy.uint8,sep='')
img2 = img2.reshape(fig.canvas.get_width_height()[::-1] (3,))
img2 = cv2.cvtColor(img2, cv2.COLOR_RGBA2BGRA)
plt.close(fig)
out.write(img2)
cap.release()
out.release()
代碼運行沒有錯誤,但回傳一個空檔案。我正在使用 matplotlib,因為我還沒有找到任何方法將資料曲線繪制到 openCV 中的視頻檔案上 - 我找到了一個叫做 plot2d 的東西,但是我找不到任何成功代碼的例子,我什至不能呼叫它,所以我放棄。我已經嘗試了 XVID、DIVX 和 MP4V(和小寫 mp4v)的四個 CC 代碼,都沒有成功。我在這里看過所有其他類似的問題,但沒有一個對我有用。
uj5u.com熱心網友回復:
我可以確定兩個問題:
的視頻大小引數
cv2.VideoWritershould(width, height)和 not(height, width)。
替換out = cv2.VideoWriter(filename.replace('.','splined.'),fourcc, fps, fig.canvas.get_width_height()[::-1])為:out = cv2.VideoWriter(filename.replace('.','splined.'),fourcc, fps, fig.canvas.get_width_height())cv2.VideoWriter不支持BGRA顏色格式(至少不支持相關編解碼器)。
替換img2 = cv2.cvtColor(img2, cv2.COLOR_RGBA2BGRA)為:img2 = cv2.cvtColor(img2, cv2.COLOR_RGBA2BGR)
使用 XVID 編解碼器會發出警告訊息。
建議替換fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')為:
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
這是我用于測驗的代碼:
import numpy
import cv2
import matplotlib.pyplot as plt
filename = 'in1.mp4'
Startframe = 1
Stopframe = 10
fps = 1
TimeSplines = numpy.random.randint(100, size=(2, 100, 100))
cap = cv2.VideoCapture(filename)
print(cap.isOpened())
a,img=cap.read(0)
#fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
fig = plt.figure()
fig.subplots_adjust(0,0,1,1)
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
fig.canvas.draw()
#out = cv2.VideoWriter(filename.replace('.','splined.'),fourcc, fps, fig.canvas.get_width_height()[::-1])
out = cv2.VideoWriter(filename.replace('.','splined.'),fourcc, fps, fig.canvas.get_width_height())
plt.close(fig)
for x in range(Startframe, Stopframe):
print(x)
cap.set(cv2.CAP_PROP_POS_FRAMES,x)
a,img=cap.read(0)
fig = plt.figure()
fig.subplots_adjust(0,0,1,1)
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.plot(TimeSplines[1,:,x-Startframe],TimeSplines[0,:,x-Startframe])
fig.canvas.draw()
img2 = numpy.fromstring(fig.canvas.tostring_rgb(), dtype=numpy.uint8,sep='')
img2 = img2.reshape(fig.canvas.get_width_height()[::-1] (3,))
#img2 = cv2.cvtColor(img2, cv2.COLOR_RGBA2BGRA)
img2 = cv2.cvtColor(img2, cv2.COLOR_RGBA2BGR)
plt.close(fig)
out.write(img2)
cv2.imshow('img2', img2)
cv2.waitKey(1000)
cap.release()
out.release()
cv2.destroyAllWindows()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/387269.html
下一篇:分段黑色和移動像素
