2016-03-17 4 views
2

Я пытаюсь прочитать определенные пиксельные цвета с помощью openCV из cv :: mat, но я получаю разные результаты для одного и того же цвета. Поэтому я попытался протестировать, чтобы писать пиксельные цвета, что также приводит к странным цветам, которые отличаются от моего ввода. для чтения цвета пикселей я использую:Изменить цвет одного пикселя в openCV

Mat dst; 
struct { 
    Vec3b colorrgb[10]; 
} RGBscan; 
int aktivy[11] = {0, 430, 200, 170, 140, 200, 420, 670, 725, 725, 670}; 
int aktivx[11] = {0, 50, 200, 480, 920, 1200, 1360, 1200, 880, 540, 220}; 
for (int i = 1; i < 11; i++) { 
    RGBscan.colorrgb[i] = dst.at<Vec3b>(aktivy[i], aktivx[i]); 
    cout << "rgbcode: " << RGBscan.colorrgb[i] << " x: " << aktivx[i] 
     << " y: " << aktivy[i] << "\n"; 
}; 

хотя некоторые пиксели содержат один и тот же цвет в резюме :: Mat ДСТ я получить разные результаты в командной строке.

Кроме того, когда я стараюсь так установить пиксель на другой цвет с:

dst.at<Vec3b>(436, 50) = 255, 255, 255; 
dst.at<Vec3b>(437, 50) = 255, 255, 255; 
dst.at<Vec3b>(438, 50) = 255, 255, 255; 
dst.at<Vec3b>(439, 50) = 0, 0, 0; 
dst.at<Vec3b>(440, 50) = 0, 0, 0; 

я получить другой цвет, напечатанный на картинке. Когда я проверяю напечатанные пиксели с помощью gimp, (255, 255, 255) теперь: (255, 110, 110) и (0, 0, 0): (0, 210, 210).

Исходный цвет этих пикселей находится в RGB (210, 210, 210).

Я просто не понимаю, что я делаю неправильно. Ценю вашу помощь! :)

+1

C++ не Python, попробуйте как : 'dst.at (436, 50) = Vec3b (255, 255, 255);' – Miki

+0

В качестве побочного элемента 'RGBscan.colorrgb [10] = ...' выходит за пределы. – SpamBot

+1

ваш «RGBscan» бесполезен и не прав, когда вы читаете за гранью. Вы можете использовать 'std :: vector в конце концов – Miki

ответ

1

При назначении нового значения с:

dst.at<Vec3b>(436, 50) = 255, 255, 255; 

вы используете C++ comma operator.

Чтобы присвоить новое значение, вы должны использовать:

dst.at<Vec3b>(436, 50) = Vec3b(255, 255, 255); 

Также обратите внимание, что вы читаете из границ, когда i==10:

RGBscan.colorrgb[i] = ... // out of bounds when i == 10 
+0

ok, я буду работать в моей структуре позже. Теперь я попробовал dst.at (436, 50) = Vec3b (255, 255, 255); но он делает то же самое, что и dst.at (436, 50) = 255, 255, 255; Я также узнал, что изменяется только первое значение. поэтому, когда я использую 1, 255, 255, пиксель получает 1 набор, но не 255, 255. Что может быть причиной? –

+0

Просьба представить рабочий пример, который показывает эту проблему (см., Как сделать [mcve]) – Miki

+0

ОК, я минимизировал свой код и пробовал некоторые вещи. прежде всего, я получаю свою фотографию из GetDC, после нее она преобразуется для использования cv :: Mat. Когда я сначала сохраняю изображение с помощью iwrite («test.bmp», dst); и после этого прочитайте его с помощью dst2 = imread ("test.bmp", IMREAD_ANYCOLOR); Я могу успешно изменить пиксели на желаемый цвет. Для преобразования я использую bitmapinfoheader, контекст устройства и некоторые обработчики (hdc & hbmp). С GetDIBits я получаю src.data для моего cv :: Mat src. Что-то здесь не работает, я еще не понял. –

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