You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:22:21