c++ - 为什么更改视频格式会更改其像素值?
问题描述
我已经构建了一个使用 OpenCV 和 C++ 分析视频的软件,但我最近注意到一个奇怪的歧义:
我有两个版本的相同视频,一个 MP4 和一个使用在线工具转换的 AVI。如果我将两个视频文件都输入 OpenCV(作为 VideoCapture 对象),并且在任何处理之前,如果我只是在 (x,y) 处输出某个像素的值,则像素值不匹配。
示例代码:
VideoCapture cap(filename);
if (!cap.isOpened()) return;
//Load a frame
Mat frame;
cap >> frame;
std::cout << frame.at<Vec3b>(316,316)[0] << std::endl;
AVI的输出:
176
MP4 的输出:
159
这对我的软件来说是个问题,而且是一个奇怪的结果。我注意到视频的解压类型从 cvid(在 AVI 中)变为 avc1(在 MP4 中)。
这些模棱两可的解释是什么?构建视频分析软件的人将如何抵消它们?
解决方案
答案实际上很奇怪。值的变化是由于用于压缩原始视频的编码。MP4 使用 h.264,AVI 使用 xvid。每一帧 I、B 和 P 的处理方式都略有不同,这使得每个像素中的数据都发生了一点变化。
推荐阅读
- javascript - JS/JQuery 编辑/更新表格行
- owin - 将 Kentor.AuthServices 升级到 Sustainsys.Saml2 后 /saml2/idp/ 出现 404 错误
- php - 如何覆盖 prestashop 中的 tpl 模块?
- docker - 如何用 docker 文件覆盖 nginx 默认配置?
- c++ - 线程的示例程序计数器
- ios - 识别不是 NSContentSizeLayoutConstraint 或类似的高度/宽度约束
- mysql - 如何定义具有相同名称的 LEFT JOIN 变量
- angular - 是否可以在 Angular 的项目文件夹中保存文件?
- javascript - Javascript 代码不适用于除第一个之外的所有 css 类
- c# - 如何使用图像附件将邮件发送到多个 id?