Как получить доступ к каждому значению пикселя изображения RGB?

Я пытаюсь прочитать изображение RGB. Однако я могу получить доступ только с типом Vec3b, а не с каждым каналом. Я уверен, в чем проблема. Хочешь помочь мне из беды?

imgMod = imread("rgb.png");

for (int iter_x = 0; iter_x < imgMod.cols; ++iter_x)
{
    for (int iter_y = 0; iter_y < imgMod.rows; ++iter_y)
    {
        cout << imgMod.at<cv::Vec3b>(iter_y, iter_x) << "\t";
        cout << imgMod.at<cv::Vec3b>(iter_y, iter_x)[0] << "\t";
        cout << imgMod.at<cv::Vec3b>(iter_y, iter_x)[1] << "\t";
        cout << imgMod.at<cv::Vec3b>(iter_y, iter_x)[2] << endl;
    }
}

Вот результат для значения пикселя изображения RGB.

[153, 88, 81]          X     Q
[161, 94, 85]    。    ^     T
...

person Hojung Jung    schedule 30.09.2014    source источник


Ответы (1)


С доступом все в порядке.
Оператор [] возвращает тип char, поэтому значение печатается как char — текстовый символ. Просто приведите его к int, чтобы увидеть значение серого как целое число:

cout << int(imgMod.at<cv::Vec3b>(iter_y, iter_x)[0]) << "\t";

(Более читаемый и явный) С++ способ сделать это будет следующим:

static_cast<int>(imgMod.at<cv::Vec3b>(iter_y, iter_x)[0]) << "\t";

Еще круче это (неясно?) маленькая хитрость - обратите внимание на +:

cout << +imgMod.at<cv::Vec3b>(iter_y, iter_x)[0] << "\t";
//      ^
person Adi Shavit    schedule 30.09.2014
comment
Спасибо! Это сработало. Кстати, есть ли разница между int(imgMod.at‹cv::Vec3b›(iter_y, iter_x)[0]) и (int)imgMod.at‹cv::Vec3b›(iter_y, iter_x)[0 ] ?? - person Hojung Jung; 30.09.2014
comment
Круто, тогда можешь пометить ответ как отвеченный. Я не уверен, что будет разница. (Более читаемый и явный) C++ способ сделать это будет следующим: static_cast<int>(imgMod.at<cv::Vec3b>(iter_y, iter_x)[0]). - person Adi Shavit; 30.09.2014
comment
О, я вижу! Спасибо еще раз :) - person Hojung Jung; 01.10.2014
comment
@HojungJung: Если проблема решена, отметьте вопрос как ответ :-). - person Adi Shavit; 01.10.2014