【问题标题】:OpenCV vs Matlab : Different Values on pixels with imreadOpenCV vs Matlab:具有 imread 的像素上的不同值
【发布时间】:2015-10-14 23:03:56
【问题描述】:

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

通过读取相同的文件 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:我也对其他像素进行了测试,结果相同:封闭结果但不完全相等。

【问题讨论】:

  • 您能否提供有问题的 JPEG 文件以供进一步调查?
  • 还发布了整个 openCV 代码,您可以在其中保存图像。
  • matlab代码和c++应用程序在同一个目录吗?你确定这两个文件是一样的吗?例如您没有在其他位置打开+保存图像(可能会引入额外的 jpeg 压缩效果)?
  • 您好!感谢您的回答,很抱歉我的回答耽误了时间! @ypnos 我丢失了我的第一个示例,但我找到了另一个示例,您可以使用这张图片 link 测试我上面写的代码,尝试使用 Matlab 中的像素 (86,86)(等等 (85,85 ) 在 openCV 中。我在 openCV 中找到 (92,104,118),在 Matlab 中找到 (91,105,118)。
  • @AnderBiguri 我不保存图像。这是我测试的全部代码。我在 Visual Studio 2013 中使用“调试”检查 openCV 值,但如果我添加 cout 以在控制台中查看值,它是相同的。

标签: matlab opencv jpeg opencv3.0 imread


【解决方案1】:

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

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

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

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

【讨论】:

  • 我有同样的问题,但你的解释有点难以理解。例如,我是否需要创建掩码,如果需要,如何创建?能不能解释的详细一点?
  • 不,我说的是面具,因为它在我的应用程序中。与问题没有关系。使用 openCV 2.4.11 和 3.0,由于 openCV 使用的库,您不会在 matlab 中获得相同的结果。如果您想获得与 Matlab 相同的结果(通过读取 jpeg 图像),您可以使用 openCV 2.4.10 及之前版本,或者尝试使用 libjpeg 6b 而不是默认使用的 8 编译 openCV 2.4.11(或 3.0) .我不知道哪个版本好,但我认为它是 6b,因为我的应用程序结果更好。
【解决方案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。使用您的代码时,我得到相同的结果。 我想在你的影响力之外的地方有一个错误。

【讨论】:

  • 非常感谢!我已经复制了你的代码,实际上我没有相同的结果......我刚刚下载了 openCV 2.4.10,我得到了很好的价值。所以可以说问题出在3.0版本上。
  • 在 OpenCV 2.4.11 上,我在 (85,85) 得到 [118, 104, 92]。可以分享一下你用的什么平台吗?我在 Mac OS X Yosemite - 10.10.4 上。我怀疑它不仅仅是版本......它也可能依赖于平台。
  • @rayryend 我尝试使用 openCV 2.4.10(我有相同的值:118、105、91),但没有使用 2.4.11!在 Visual Studio 2013 和 MSI GP70(Windows 7)上!
  • 您应该向 OpenCV 项目提交错误报告。
  • 嗯,法令被取消了,但是改变法令的人的回答并没有回答它在 2.4.10 版本上运行良好而不是在更高版本上运行良好的事实..
猜你喜欢
  • 2020-01-13
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2019-02-24
相关资源
最近更新 更多