14

imread()我在 Windows 7 上使用 jpg 文件的 Matlab (2014) 和 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;

代码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:我也对其他像素进行了测试,结果相同:封闭结果但不完全相等。

4

2 回答 2

7

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

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

为了解决我的问题(我使用图像和背景的一些差异来创建蒙版,我的问题是我在使用 OpenCV(没有 libjeg 版本 6b)的图像中有一些雪,我用 libjpeg 6b 编译了 OpenCV 3.0。(我也有导入 2 个运行时库并将其放入我的项目中,可在网上免费找到)。

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

于 2015-08-20T07:54:48.680 回答
2

此代码为您的示例图像提供了正确的值test2.jpg

#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

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

于 2015-07-27T23:37:28.330 回答