Доступ к элементам в многоканальном мате OpenCV

Это мой первый пост на stackru, так что я надеюсь сделать все правильно, извините, если я этого не сделаю.

Я пишу код для функции для преобразования одного значения RGB в цветовое пространство CIE L*a*b*. Предполагается, что функция принимает массив с 3 поплавками (каналы RGB со значениями в [0-255]) и выдает на выходе массив с 3 поплавками со значениями L * a * b *. Для этого я использую cvtColor функция доступна с OpenCV.

Как предложено на сайте openCV, я создаю структуры Mat (необходимо для cvtColor) по конструктору.

Моя проблема в том, что, хотя я думаю, что код работает правильно и выполняет преобразование, я не могу вернуть значения, содержащиеся в структуре Mat.

Вот мой код:

float * rgb2lab(float rgb[3]) {
    // bring input in range [0,1]
    rgb[0] = rgb[0] / 255;
    rgb[1] = rgb[1] / 255;
    rgb[2] = rgb[2] / 255;

    // copy rgb in Mat data structure and check values
    cv::Mat rgb_m(1, 1, CV_32FC3, cv::Scalar(rgb[0], rgb[1], rgb[2]));
    std::cout << "rgb_m = " << std::endl << " " << rgb_m << std::endl;
    cv::Vec3f elem = rgb_m.at<cv::Vec3f>(1, 1);
    float R = elem[0];
    float G = elem[1];
    float B = elem[2];
    printf("RGB =\n [%f, %f, %f]\n", R, G, B);

    // create lab data structure and check values
    cv::Mat lab_m(1, 1, CV_32FC3, cv::Scalar(0, 0, 0));
    std::cout << "lab_m = " << std::endl << " " << lab_m << std::endl;

    // convert
    cv::cvtColor(rgb_m, lab_m, CV_RGB2Lab);

    // check lab value after conversion
    std::cout << "lab_m2 = " << std::endl << " " << lab_m << std::endl;
    cv::Vec3f elem2 = lab_m.at<cv::Vec3f>(1, 1);
    float l = elem2[0];
    float a = elem2[1];
    float b = elem2[2];
    printf("lab =\n [%f, %f, %f]\n", l, a, b);

    // generate the output and return
    static float lab[] = { l, a, b };
    return lab;
}

Как видите, я извлекаю все каналы из структуры Mat с помощью at функция, а затем доступ к ним по отдельности из вектора. Это предлагается в качестве решения во многих местах ( одно из них).

Но если я запускаю этот код (входной вектор был {123,10,200}), на cout Я правильно получаю выходные данные структур Mat (из которых я получаю, алгоритм конвертирует правильно), но, как вы можете видеть, извлеченные значения неверны:

rgb_m = 
 [0.48235294, 0.039215688, 0.78431374]
RGB =
 [0.000000, 0.000000, -5758185472.000000]
lab_m = 
 [0, 0, 0]
lab_m2 = 
 [35.198029, 70.120964, -71.303688]
lab =
 [0.000000, 0.000000, 4822177514157213323960797626368.000000]

У кого-нибудь есть представление о том, что я делаю не так?

Большое спасибо за вашу помощь!

1 ответ

Решение

Первый элемент cv::Mat всегда в (0, 0)так просто поправь cv::Vec3f elem = rgb_m.at<cv::Vec3f>(1, 1); от cv::Vec3f elem = rgb_m.at<cv::Vec3f>(0, 0); а также cv::Vec3f elem2 = lab_m.at<cv::Vec3f>(1, 1); от cv::Vec3f elem2 = lab_m.at<cv::Vec3f>(0, 0);

Другие вопросы по тегам