我正在按照一些说明将多段线绘制到图像中(使用 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'
有人能告诉我原因吗?谢谢。
您的问题出在这一行:
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。因此,请确保它在相同的色彩空间中。这是为了以防万一它没有画出预期的红线,而是画了一条蓝线。
我是一名优秀的程序员,十分优秀!