IOS OpenCV конвертировать hexcolor в скалярный цвет -> получить только черный цвет - PullRequest
0 голосов
/ 09 января 2019

Я следую некоторой инструкции для рисования полилиний в изображение (используя opencv), но я не знаю, почему я получил только черный цвет при преобразовании из шестнадцатеричного цвета в скалярный. Вот мой код:

 //convert hex to rgb
        const char *cStr = [obj.backColor cStringUsingEncoding:NSASCIIStringEncoding]; //FF0000
        long x = strtol(cStr+1, NULL, 16);
        unsigned char r, g, b;
        b = x & 0xFF;
        g = (x >> 8) & 0xFF;
        r = (x >> 16) & 0xFF;
        cv::polylines(mat, v, true, cv::Scalar((int)(r/255.0), (int)(g/255.0), (int)(b/255.0), 255), 4);

Я отлаживаю, затем получил:

x   long    16711680
r   unsigned char   '\xff'
g   unsigned char   '\0'
b   unsigned char   '\0'

Может кто-нибудь сказать мне причину? Спасибо.

1 Ответ

0 голосов
/ 09 января 2019

Ваша проблема в этой строке:

cv::polylines(mat, v, true, cv::Scalar((int)(r/255.0), (int)(g/255.0), (int)(b/255.0), 255), 4);

Это всегда черный цвет, потому что r g и b уже являются числами от 0 до 255 (вы делали это и раньше), если вы поделите на 255, это будет между 0 и 1, а затем вы разыграете это к int, которое даст вам в большинстве случаев 0, который черный.


Если mat имеет тип CV_8UC4, тогда все в порядке:

cv::polylines(mat, v, true, cv::Scalar(r, g, b, 255), 4);

, если mat имеет тип CV_32F, тогда можно использовать значения от 0-1

cv::polylines(mat, v, true, cv::Scalar((r/255.0), (g/255.0), (b/255.0), 255), 4); 

Поскольку вы сказали, что вы новичок в OpenCV, будьте осторожны с цветовым пространством. OpenCV обычно использует BGR (A) в большинстве функций (imshow, imwrite и т. Д.), Но здесь скаляр - RGBA. Поэтому убедитесь, что он находится в том же цветовом пространстве. Это на тот случай, если он не закрашивает намеченную красную линию, а синюю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...