OpenCV 4.5.2 Java绑定使用VideoWriter生成视频垂直翻转如何修复?
OpenCV 4.5.2 Java绑定生成视频垂直翻转修复方案
根因分析
你遇到的垂直翻转问题本质是字节数组的行存储顺序和OpenCV Mat的默认行存储顺序不匹配:
- 直接导出ByteArray为bmp正常,是因为bmp文件格式默认采用从下到上的行存储顺序,和你传入的ByteArray行序一致
- OpenCV Mat默认采用从上到下的行存储顺序,直接把ByteArray数据写入Mat后,行序完全倒置,因此导出单帧、生成视频都会出现垂直翻转
- 旧版本运行正常大概率是当时的数据源行序、或数据预处理逻辑和当前环境不同,和OpenCV版本本身关联不大
修复方法
在写入Mat数据后、输出到视频/文件前,调用OpenCV原生的垂直翻转方法处理Mat即可,该方法为Native实现,性能损耗极低。
代码修改示例
仅需要修改writeFrame方法,新增一行翻转逻辑:
import org.opencv.core.Core // 其余原有代码保持不变 fun writeFrame(data: ByteArray) { currentFrame.put(0, 0, data) // flipCode = 0 代表沿X轴翻转,即垂直翻转 Core.flip(currentFrame, currentFrame, 0) videoWriter.write(currentFrame) }
修改完成后可先调用Imgcodecs.imwrite导出单帧验证,确认方向正常后再生成视频即可。
可选优化
如果你的业务场景对性能要求极高,也可以在生成传入的ByteArray时,直接按照从上到下的行序生成,省略翻转步骤。但大多数场景下直接使用Core.flip的性能足够,无需额外调整数据生成逻辑。
内容的提问来源于stack exchange,提问作者artem
相关产品推荐
相关产品推荐

