ios opencv 将十六进制颜色转换为标量颜色 -> 只得到黑色

标签 ios opencv colors

我正在按照一些说明将多段线绘制到图像中(使用 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 gb 已经是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。因此,请确保它在相同的色彩空间中。这是为了以防万一它没有画出预期的红线,而是画了一条蓝线。

关于ios opencv 将十六进制颜色转换为标量颜色 -> 只得到黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54105612/

相关文章:

matlab - 加快样条曲线的着色段?

objective-c - 在缓冲区中添加2个正弦波会产生噪声

ios - 尝试减少 for 循环 Swift 中的内存影响 (4)

ios - AF网络 2 : canceling batch requests

ios - OpenCV - 无法访问 Mat 中的所有像素

opencv - 构建 OpenCV 时出现 Cmake 错误

android - TextView在同一行,选择一个取消另一个

Java代码如何将颜色附加到列表一定次数

iOS 7.1 动画错误

openCV三角点