2014-08-31 36 views
2

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

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

的C++代码在OpenCV中获得RGB值分别是:

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

我应该如何解决这个问题?

+1

请提供代码和示例数据,以便重现您的问题。 – Daniel 2014-08-31 19:09:03

+0

是的,我已经更新。 – user2970089 2014-08-31 19:21:35

+0

提供的代码不会重现任何问题。首先,没有Matlab代码。其次,OpenCV代码太笼统。如果声称一帧中的RGB值对于(0,0)是错误的,则显示检查/显示该值的代码。最后,这可能有助于解决导致问题的数据。 – horchler 2014-08-31 19:30:08

回答

-1

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

+1

我已经更新了我的问题。是的,我知道索引,所以我检查了C++中的(0,0)和Matlab中的(1,1),没有索引错误。 – user2970089 2014-08-31 18:56:37

+0

i&j呢?你也使用正确的索引吗? – Amen 2014-08-31 18:59:15

+0

尝试在零值(黑色)像素或255(白色)像素上检查您的代码,如果它们不相同,那么肯定存在代码错误,或者您忽略了某些内容。 – Amen 2014-08-31 19:03:42

1

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

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

建议的解决方案

1)相同解码器 - 如果你需要这两种工具是在结果相同,使用相同的解码器两种。可以更改OpenCV或MATLAB的解码器。如果你是谷歌,你会发现如何做到这一点的文章。 Thisthis可能会有所帮助。

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

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