OpenCV.VideoWriter意外裁剪视频帧问题求助
OpenCV VideoWriter 自动裁剪帧问题
这不是一个关于如何裁剪视频的常规问题,情况恰恰相反:OpenCV在我不知情的情况下裁剪了视频帧。
我的test_X形状为:
(1803,302,154,3)
核心代码如下:
prediction = np.argmax(test_Y_predicted,axis=1) video_out = cv2.VideoWriter('Video_con_clasificación.avi', cv2.VideoWriter_fourcc(*'DIVX'), 10, (154,302)) for i in range(len(test_Y)): if test_Y[i] != prediction[i]: # Frames were normalized, so... image = (test_X[i]*255).astype(np.uint16) video_out.write(cv2.cvtColor(image,cv2.COLOR_BGR2RGB)) cv2.imshow(title,image.astype(np.uint8)) cv2.waitKey(500) cv2.destroyAllWindows() video_out.release()
cv2.imshow显示的帧正常,但生成的视频帧被裁剪。虽存在颜色通道问题,但更关注帧被裁剪的问题,请问有人遇到过类似情况吗?
原因很明确:你创建VideoWriter时指定的尺寸是(154,302),但实际写入的帧尺寸因为数据类型问题被错误解析,导致裁剪。
看test_X的形状,单帧是(302,154,3)——也就是高302,宽154,VideoWriter要求的(宽,高)参数(154,302)是正确的。问题出在图像数据类型上:
- 你把归一化后的帧转成了
uint16类型,再直接用cv2.cvtColor处理并写入视频,但OpenCV的VideoWriter只支持写入8位无符号整数(uint8)格式的帧,非uint8的图像会导致尺寸解析异常,最终出现裁剪。
解决步骤:
- 先将图像转为
uint8类型:image = (test_X[i]*255).astype(np.uint8) - 再进行颜色通道转换:
frame = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) - 确认帧尺寸和
VideoWriter指定的一致后,再写入视频:video_out.write(frame)
另外,循环里每次调用cv2.destroyAllWindows()没必要,建议放到循环结束后执行,不过这和裁剪问题无关。
内容的提问来源于stack exchange,提问作者Krakenudo
相关产品推荐
相关产品推荐

