Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV与Matlab的RGB值不同? 我试图把一个Matlab项目转移到C++代码中。然而,当我试图逐帧读取mp4视频时,每个像素的RGB值与Matlab非常不同。这是否意味着OpenCV使用了不同的RGB值表示?如果是,如何将OpenCV值更改为Matlab?否则,我无法通过检查值来验证我的实现是否正确_C++_Matlab_Opencv_Image Processing - Fatal编程技术网

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

OpenCV与Matlab的RGB值不同? 我试图把一个Matlab项目转移到C++代码中。然而,当我试图逐帧读取mp4视频时,每个像素的RGB值与Matlab非常不同。这是否意味着OpenCV使用了不同的RGB值表示?如果是,如何将OpenCV值更改为Matlab?否则,我无法通过检查值来验证我的实现是否正确,c++,matlab,opencv,image-processing,C++,Matlab,Opencv,Image Processing,例如: 我试图在OpenCV和Matlab中检查点(0,0)值。OpenCV给出以下结果:blue=106 green=105 red=102 但是,在Matlab中,结果是:blue=85 green=86 red=83 我试图得到点(0,0)的RGB值,在Matlab中每200帧就是点(1,1) < > OpenCV中获得RGB值的C++代码是: Mat img; number = 0; VideoCapture cap(filename_input_video); if(!cap.isOp

例如: 我试图在OpenCV和Matlab中检查点(0,0)值。OpenCV给出以下结果:
blue=106 green=105 red=102
但是,在Matlab中,结果是:
blue=85 green=86 red=83
我试图得到点(0,0)的RGB值,在Matlab中每200帧就是点(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;
    }
}

如何解决此问题?

否!它没有!您可以看到不同的结果,因为C++数组索引从零开始,而Matlab/OcTAVE索引从1开始。

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

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

建议的解决办法:

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

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

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

我已经更新了我的问题。是的,我知道索引,所以我检查C++中的(0,0)和(1,1),没有索引错误。Matlab和J呢?你对它们也使用了正确的索引吗?试着在零值(黑色)像素或255(白色)像素上检查你的代码,如果它们不相同,那么你的代码肯定有问题,或者你忽略了什么。i,j是图像点位置的索引。我已经更新了。你在双for循环中访问了视频的哪一帧,你在matlab上访问了哪一帧?您确定帧是相同的吗?请提供代码和示例数据,以允许再现您的问题。是的,我已经更新。提供的代码不再现任何问题。首先,没有Matlab代码。第二,OpenCV代码过于通用。如果声称一帧的(0,0)的RGB值错误,则显示检查/显示该值的代码。最后,它可能有助于找到引起问题的有问题的数据。我已经包含了Matlab代码,它应该是正确的。您应该比较从光盘读取的单个图像的RGB值。如果读取从视频捕获的帧/图像,可能会有差异,因为视频解码器可能不同。试试这个,让我们知道。
`c:/> ffmpeg -i compressed_or_original_video.avi -vcodec rawvideo raw_converted_video.avi`