OpenCV vs Matlab:带有imread的像素的不同值

时间:2015-07-24 10:08:07

标签: matlab opencv jpeg opencv3.0 imread

我遇到了Matlab(2014)中的函数imread()和Windows 7上带有jpg文件的OpenCV(3.0)的问题。

通过读取相同的文件jpg和相同的像素,我没有相同的值。

以下是我的2个代码:( OpenCV代码后跟Matlab代码)和我的值(模式调试在OpenCV中看到,键盘在Matlab中)

#include <opencv2\opencv.hpp>
#include <cstdio>

using namespace cv;
using namespace std;

int main()
{
     Mat img = imread("test.jpg");

     uchar pb = img.at<Vec3b>(0, 0).val[0];
     uchar pg = img.at<Vec3b>(0, 0).val[1];
     uchar pr = img.at<Vec3b>(0, 0).val[2];

     int d = img.depth();

     int t = img.type();
}

值:

     pixel [0,0] = (147,174,204); // = index(1,1) in the image.
     d = 0;
     t = 16;

Code Matlab:

img = imread('test.jpg');

img(1,1,:)

whos img

值:

ans(:,:,1) =
148

ans(:,:,2) =
174

ans(:,:,3) =
201

Name         Size                   Bytes  Class    Attributes
img       1920x2560x3            14745600  uint8     

你知道为什么价值观不同吗?

我在另一篇文章中看到过像这样的问题,但是这个人通过阅读tiff没有相同的深度。在这里,你可以看到我有相同的深度!

提前感谢您,对于任何英语错误感到抱歉。

PS:我也测试了其他像素,结果相同:关闭结果但不完全等于。

2 个答案:

答案 0 :(得分:6)

对于阅读此主题的人来说,这是最终的解释:

它来自libjpeg的版本。版本6b(OpenCV在2.4.11之前使用此版本)的工作方式与Matlab 2014b相同。从libjpeg的第8版开始,我得到了上面提到的其他结果。

为了解决我的问题(我使用了一些不同的图像和背景来创建一个掩码,我的问题是我在OpenCV图像中有一些雪(没有libjeg版本6b),我用libjpeg 6b编译了OpenCV 3.0。(我还必须导入2个运行时库并将其放在我的项目中,可以在网上自由找到。

我没有报告OpenCV上的错误。说实话,我没有管理,即使我尝试过,我也不明白他们的网站怎么做......

答案 1 :(得分:2)

此代码为示例图像#include <opencv2/highgui/highgui.hpp> #include <iostream> int main() { auto img = cv::imread("test2.jpg"); auto pixel = img.at<cv::Vec3b>(85, 85); std::cout << (int)pixel[0] << "\t" << (int)pixel[1] << "\t" << (int)pixel[2] << std::endl; } 提供了正确的值:

118     105     91

输出:

contains

这里的OpenCV版本是2.4.10。使用代码时,我得到相同的结果。 我想某个地方有一个超出你影响的错误。