OpenCV vs Matlab: разные значения для пикселей с imread

Я столкнулся с проблемой с функцией imread() в Matlab (2014) и OpenCV (3.0) в Windows 7 с файлами jpg.

У меня нет одинаковых значений, читая один и тот же файл 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: У меня есть тест с другими пикселями, те же результаты: закрытые результаты, но не совсем равные.

Ответ 1

Для людей, которые прочитали бы эту тему, это окончательное объяснение:

Он исходит из версии libjpeg. Версия 6b (OpenCV использовала этот вариант до версии 2.4.11) работает так же, как Matlab 2014b. Из версии 8 libjpeg у меня были другие результаты, о которых я упоминал выше.

Чтобы решить мою проблему (я использовал некоторую разницу изображений и фона для создания маски, и моя проблема заключалась в том, что у меня был некоторый снег на изображении с OpenCV (без libjeg версии 6b), я скомпилировал OpenCV 3.0 с libjpeg 6b. ( Мне также пришлось импортировать 2 библиотеки времени выполнения и поместить их в мой проект, который можно найти в Интернете).

Я не сообщал об ошибке в OpenCV. Честно говоря, я не справился, я не понимал, как делать на своем веб-сайте, даже я пробовал...

Ответ 2

Этот код дает правильные значения для вашего примера image 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. Я получаю тот же результат при использовании вашего кода. Я предполагаю, что есть ошибка, которая находится вне вашего влияния.