OpenCV - неправильные результаты при доступе к Mat

Вкратце, я хотел бы суммировать значения в мат-матрице. На данный момент у меня есть мат 256 на 1 (который на самом деле является вектором, но формат мата будет важен позже). Чтобы увидеть, что происходит, я пытаюсь напечатать его в цикле.

`
calcFractile(Mat* in){

cout << "Input = " << *in << endl;
cout << "?!?! ";
for(int k = 0; k<in->rows; k++){
    cout << static_cast<int>(in->at<uint8_t>(0,k)) << ", ";
    sum += (int)in->at<uint8_t>(0,k);
}
cout <<endl;
}

`

Я совершенно не понимаю, почему, но строка cout ‹‹ "Input[...] дает правильный результат, но цикл, обращающийся к отдельным элементам, дает разные результаты. Проблема не только в значении, но и в позициях в массиве.

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


person user3002166    schedule 17.11.2013    source источник
comment
Возможно, uint8_t вызывает некоторые проблемы. Я предполагаю, что если входная матрица является гистограммой, то она имеет какой-то другой тип (не имеет смысла хранить значения меньше 256). Для получения более подробных ответов необходимо указать SSCCE.   -  person Sigroad    schedule 17.11.2013
comment
да, подобное возражение здесь. пожалуйста, проверьте, если in.type()==0; (иначе это не чар)   -  person berak    schedule 17.11.2013
comment
Спасибо за ваши предложения. Я не думаю, что смогу сделать SSCCE из этого кода, и я подозреваю, что никто не прочитает его полностью, если я попытаюсь найти добровольца, но я думаю, что нашел его. По какой-то странной причине использование 'static_cast‹int›(in-›at‹float›(0,k)' решило проблему. Я действительно не понимаю, почему, потому что гистограмма была построена с использованием одного столбца изображения и деления пикселей на основе по температуре с использованием 256 уровней (а именно я хотел использовать только один байт и для этого сделал 8-битное преобразование оттенков серого)...   -  person user3002166    schedule 17.11.2013


Ответы (1)


Проблема возникла из-за приведения типов, вернее отсутствия его. Как только я написал

static_cast (в-> в (0, к)

и это сработало. Также просто (int)(in->at(0,k) работает нормально.

Урок, который я усвоил - *всегда проверяйте приведение типов * не то, чтобы это что-то новое, но, возможно, кому-то будет полезно

person user3002166    schedule 17.12.2013