C++ 访问多通道OpenCV Mat中的元素

C++ 访问多通道OpenCV Mat中的元素,c++,opencv,image-processing,rgb,cielab,C++,Opencv,Image Processing,Rgb,Cielab,这是我在stackoverflow上的第一篇文章,所以我希望把一切都做好,如果我没有做到,很抱歉 我正在为一个函数编写代码,将单个RGB值转换为CIE L*a*b*颜色空间。该函数应该采用3个浮点数组(RGB通道的值在[0-255]中),并在输出中给出一个3个浮点数组的L*a*b*值。为此,我使用OpenCV提供的函数 正如上所建议的,我正在由Contractor创建Mat结构(cvtColor需要) 我的问题是,尽管我认为代码运行正常并执行了转换,但我无法恢复Mat结构中包含的值 这是我的密码

这是我在stackoverflow上的第一篇文章,所以我希望把一切都做好,如果我没有做到,很抱歉

我正在为一个函数编写代码,将单个RGB值转换为CIE L*a*b*颜色空间。该函数应该采用3个浮点数组(RGB通道的值在[0-255]中),并在输出中给出一个3个浮点数组的L*a*b*值。为此,我使用OpenCV提供的函数

正如上所建议的,我正在由Contractor创建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;
}
有人知道我做错了什么吗


非常感谢你的帮助

一个
cv::Mat
的第一个元素总是在
(0,0)
,所以只要纠正
cv::Vec3f elem=rgb_m.at(1,1)通过
cv::Vec3f elem=rgb_m.at(0,0)
cv::Vec3f elem2=lab_m.at(1,1)
cv::Vec3f elem2=lab_m.at(0,0)

您的访问是正确的,但索引是错误的。矩阵索引从0开始,所以要访问第一个元素,您需要类似于
rgb_m.at(0,0)
的东西。问题似乎是(1,1),Mat的第一个元素位于(0,0),至于vectorYes,您完全正确。我不敢相信我犯了这么愚蠢的错误。因为我看到的所有指南都使用了(1,1)符号,所以我认为这是在使用关于索引的“Matlab”约定。。。谢谢你的回答。
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]