试图将数据绘制到视频上,但OpenCV VideoWriter生成空文件(之前没有解决方案)



我正试图打开一个视频,读入一帧,在上面画一条数据曲线,然后将该帧保存到视频文件中。输入文件是来自各种相机的*.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代码,但都没有成功。我在这里看了所有其他类似的问题,但没有一个对我有效

我可以确定两个问题:

  • cv2.VideoWriter的视频大小参数应该是(width, height),而不是(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()

相关内容

最新更新