c++ - OpenCV 具有与 Matlab 不同的 RGB 值?

标签 c++ matlab opencv image-processing

我正在尝试将一个 matlab 项目转换为 C++ 代码。但是,当我尝试逐帧读取 mp4 视频时,每个像素的 RGB 值与 Matlab 有很大不同。这是否意味着 OpenCV 使用了不同的 RGB 值表示?如果是这样,如何将 OpenCV 值更改为 Matlab?否则我无法通过检查值来验证我的实现是否正确。

例如: 我正在尝试检查 OpenCV 和 Matlab 中的点 (0,0) 值。 OpenCV 给出以下结果:blue=106 green=105 red=102 然而,在 Matlab 中,结果是:blue=85 green=86 red=83 我尝试每 200 帧获取 point(0,0) 中的 RGB 值,这在 Matlab 中是 point(1,1)。

OpenCV中获取RGB值的C++代码是:

Mat img;
number = 0;
VideoCapture cap(filename_input_video);
if(!cap.isOpened()) {
    printf("No video to Read!\n");
    return -1;
}

for( ; ; ) {
    cap >> img;
    if(img.empty())
        break;
    number++;

    for(int i=0; i<img.rows; i++) {
        for(int j=0; j<img.cols; j++) {
            int blue = img.at<Vec3b>(i, j)[0];
            int green = img.at<Vec3b>(i, j)[1];
            int red = img.at<Vec3b>(i, j)[2];

            if(number == 200 && i==0 && j==0) {
                printf("blue=%d green=%d red=%d", blue, green, red);
            }
        }
    }

    if(number == 200) {
        number = 0;
    }
}

Matlab 代码为:

OBJ = VideoReader(filename_source);
fBlock = 200;
nFrame = get(OBJ, 'NumberOfFrames');
nBlock = ceil(nFrame / fBlock);

for iBlock = 1:nBlock
    display(['Processing video 1 block #' num2str(iBlock) '...']);
    start_index = (iBlock-1)*fBlock+1;
    end_index = min(iBlock*fBlock, nFrame);

    vSource = read(OBJ,[start_index end_index]);
    display(['red ' num2str(vSource(1,1,1,200))]);
    display(['green ' num2str(vSource(1,1,2,200))]);
    display(['blue ' num2str(vSource(1,1,3,200))]);

我该如何解决这个问题?

最佳答案

要验证差异,您应该比较从光盘读取的单个图像的 RGB 值。在此处读取相同的值表明您的代码可能没有问题,并且解码存在差异。

可能发生的情况:如果您读取从视频捕获的帧/图像,可能会有所不同,因为 OpenCV(默认为 ffmpeg)和 MATLAB 的视频解码器可能不同。不同的解码器可以不同地处理一些事件/错误,并且不能保证相同的解码。

建议的解决方案:

1) 相同的解码器 - 如果您需要两种工具的结果相同,请对两者使用相同的解码器。为 OpenCV 或 MATLAB 更改解码器。如果你用谷歌搜索,你会发现很少有关于如何做到这一点的文章。 Thisthis会有帮助。

2) 同一视频 - 首先使用任何解码器(我更喜欢 ffmpeg)将视频转换为原始格式。现在您可以在这两个工具上使用它而不必担心差异 ;)。这是从压缩中获取原始数据的命令:

`c:/> ffmpeg -i compressed_or_original_video.avi -vcodec rawvideo raw_converted_video.avi`

关于c++ - OpenCV 具有与 Matlab 不同的 RGB 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25595117/

相关文章:

c++ - ucnv_open 错误 U_FILE_ACCESS_ERROR

matlab - 反向传播算法(Matlab): output values are saturating to 1

node.js - 如何使用 Node 和 openCV 停止 videoCapture()

将关键点 vector 转换为 CvSeq

java - 使用多个静止图像校正 GoPro 的桶形失真?

php - 我如何制作在线编译和运行C++程序的网站

c++ - 如何使用 OpenCL C++ 绑定(bind)获得最大的全局工作量?

c++ - 在 C++ for 循环的增量部分分配指针时出现奇怪的编译错误

matlab - 错误 : Output Argument Not Assigned During Call

Matlab libsvm - 向量系数 w 遇到问题