首页 > 解决方案 > 为什么更改视频格式会更改其像素值?

问题描述

我已经构建了一个使用 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 中)。

这些模棱两可的解释是什么?构建视频分析软件的人将如何抵消它们?

标签: c++opencvimage-processing

解决方案


答案实际上很奇怪。值的变化是由于用于压缩原始视频的编码。MP4 使用 h.264,AVI 使用 xvid。每一帧 I、B 和 P 的处理方式都略有不同,这使得每个像素中的数据都发生了一点变化。


推荐阅读