2013-02-28 2 views
4

Я пытаюсь получить пиксель от объекта Mat. Чтобы проверить, я пытаюсь нарисовать диагональную линию на квадрате и рассчитывать получить идеальную линию, пересекающую верхнюю левую верхнюю правую вершину.Получите пиксель от Mat :: at

for (int i =0; i<500; i++){ 
    //I just hard-coded the width (or height) to make the problem more obvious 

    (image2.at<int>(i, i)) = 0xffffff; 
    //Draw a white dot at pixels that have equal x and y position. 
} 

Результат, однако, не так, как ожидалось. Вот диагональная линия, нарисованная на цветном изображении. enter image description here Это изображение в оттенках серого. enter image description here Кто-нибудь видит проблему?

+0

О, да, все видят проблему. – qPCR4vir

+0

@ qPCR4vir Изображение не 500x500? –

+0

его 700 * 700, но результат остается неизменным с любым числом. –

ответ

3
(image2.at<int>(i, i)) = 0xffffff; 

Похоже, что ваше цветное изображение 24bit, но ваши пиксели адресации в терминах int, которые кажутся 32 бит.

+0

Thats также, почему ошибка увеличивается при переключении на 8 бит bw – sean3k

+0

О, глупый я. Так что я не могу установить значение для пикселя напрямую, не проходя через все каналы красного, зеленого и синего? (который, я считаю, в 3 раза медленнее, чем установка только одного значения) –

+0

возможно image2.at (i, i) = 0xffffff; Я не уверен, поскольку я не знаю эту графическую структуру, которую вы используете. Я только догадываюсь, опираясь на ответ Риккарди ниже. – sean3k

6

Проблема заключается в том, что вы пытаетесь получить доступ к каждому пикселю как int (32-битное изображение на пиксель), в то время как ваше изображение представляет собой трехканальный знак без знака (24-битное изображение на пиксель) или 1-канальный беззнаковый символ (8 бит на пиксельное изображение) для оттенков серого. Вы можете попытаться получить доступ к каждому пикселю, как это для полутонового один

for (int i =0; i<image2.width; i++){ 
    image2.at<unsigned char>(i, i) = 255; 
} 

или, как это за цвет один

for (int i =0; i<image2.width; i++){  
     image2.at<Vec3b>(i, i)[0] = 255; 
     image2.at<Vec3b>(i, i)[1] = 255; 
     image2.at<Vec3b>(i, i)[2] = 255; 
} 
+0

Прохладный, спасибо. Я думал, что могу ускорить его, установив сразу все каналы, используя 'int'. –

Смежные вопросы