尝试将数据绘制到视频上,但 OpenCV VideoWriter 生成空文件(没有先前的解决方案有效)
Trying to plot data onto video, but OpenCV VideoWriter produces Empty File (No Prior Solutions Work)
我正在尝试打开一个视频,读入一个帧,在其上绘制一条数据曲线,然后将该帧保存到一个视频文件中。输入文件是来自各种相机的*.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()
代码运行没有错误,但是 returns 一个空文件。我正在使用 matplotlib,因为我还没有找到任何方法将数据曲线绘制到 openCV 中的视频文件上——我找到了一个叫做 plot2d 的东西,但我找不到任何成功代码的例子,我什至不能调用它,所以我放弃。我已经尝试了 XVID、DIVX 和 MP4V(以及小写的 mp4v)的四个 CC 代码,但都没有成功。我在这里查看了所有其他类似的问题,none 对我有用。
我可以确定两个问题:
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()
我正在尝试打开一个视频,读入一个帧,在其上绘制一条数据曲线,然后将该帧保存到一个视频文件中。输入文件是来自各种相机的*.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()
代码运行没有错误,但是 returns 一个空文件。我正在使用 matplotlib,因为我还没有找到任何方法将数据曲线绘制到 openCV 中的视频文件上——我找到了一个叫做 plot2d 的东西,但我找不到任何成功代码的例子,我什至不能调用它,所以我放弃。我已经尝试了 XVID、DIVX 和 MP4V(以及小写的 mp4v)的四个 CC 代码,但都没有成功。我在这里查看了所有其他类似的问题,none 对我有用。
我可以确定两个问题:
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()