OpenCV与Matlab有不同的RGB值吗?

时间:2014-08-31 18:41:51

标签: 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 我试图在Matlab中每200帧(点(1,1))获得点(0,0)的RGB值。

在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))]);

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

要验证差异,您应该比较从光盘读取的单个图像的RGB值。在这里读取相同的值表明你的代码可能很好,并且在解码方面存在差异。

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

建议的解决方案

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

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

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

答案 1 :(得分:-1)

没有!它不是!你会看到不同的结果,因为C ++数组索引从零开始,而matlab / octave索引从1开始。