【问题标题】:ios opencv convert hexcolor to scalar color -> only get black colorios opencv 将十六进制颜色转换为标量颜色-> 只得到黑色
【发布时间】:2019-06-03 23:03:49
【问题描述】:

我正在按照一些说明将折线绘制到图像中(使用 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'

谁能告诉我原因?谢谢。

【问题讨论】:

    标签: ios opencv colors


    【解决方案1】:

    你的问题出在这一行:

    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。因此,请确保它在相同的色彩空间中。这是以防万一它没有画出预期的红线,而是画蓝线。

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 2015-05-19
      • 2015-04-12
      • 2012-11-01
      • 2022-08-10
      • 1970-01-01
      • 2017-10-30
      相关资源
      最近更新 更多