我正在按照一些说明将折线绘制到图像中(使用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'
有人可以告诉我原因吗?谢谢。
答案 0 :(得分:2)
您的问题在这一行:
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之间的数字(您之前做过&FF),如果除以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通常在大多数功能(imshow,imwrite等)中使用BGR(A),但此处的标量为RGBA。因此,请确保它在相同的色彩空间中。以防万一它没有画出预期的红线,而是画出了蓝线。