OpenCV具有与Matlab不同的RGB值
OpenCV has different RGB values from Matlab?
我正在尝试将一个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帧的点(0,0)的RGB值,即点(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的解码器。如果你在谷歌上搜索,你会发现很少有关于如何做到这一点的文章。这个和这个可能会有所帮助。
2)相同的视频-首先使用任何解码器(我更喜欢ffmpeg)将视频转换为原始格式。现在,您可以在这两个工具上使用它,而不用担心差异;)。以下是一个从compressed:获取原始数据的命令
`c:/> ffmpeg -i compressed_or_original_video.avi -vcodec rawvideo raw_converted_video.avi`
否!事实并非如此!您会看到不同的结果,因为C++数组索引从零开始,而matlab/倍频程索引从1开始。
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 在 C++ 中将 RGB 更改为灰度
- Qt中的RGB图像处理
- 在C++中查找像素 RGB 数据的最快方法是什么?
- MATLAB to C++: csvread() not supported by MATLAB Coder
- 无法获取要在 OpenGL ES2 中显示的 RGB 纹理
- 加载由 MATLAB Coder 生成的带有函数的 DLL,该函数调用外部函数
- 如何将 MJPEG 解码为原始 RGB(或 YUV)数据
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- MATLAB:跟踪imufilter对象中的状态变化
- 如何使用 C++将 2D RGB 数组转换为 dds 文件?
- 如何将 c++ 中的客户端 TCP 的替身列表发送到 Matlab 中的 TCP 服务器?
- 将三角函数的正确值与matlab进行比较
- 连接 MATLAB 和 Visual Studios 的问题
- 如何将C++连接到 Matlab
- OpenCV具有与Matlab不同的RGB值