首页 文章

OpenCV RGB值是否为十六进制?

提问于
浏览
1

所以我使用opencv网页上的c帧访问包装器成功访问了帧中的像素数据

template<class Frame> 
class Frame_Data {
        IplImage *imgp;
        public:
        Frame_Data (IplImage *img=0) {imgp = img;}
        ~Frame_Data () {imgp = 0;}
        void operator=(IplImage *img) {imgp=img;}
        inline Frame* operator[] (int rowIndex) {
                return ((Frame*)(imgp->imageData + rowIndex*imgp->widthStep));
        }
};

typedef struct {
        unsigned char b,g,r;
} RgbPixel;
typedef struct {
        float b,g,r;
} RgbPixelFloat;

typedef Frame_Data<RgbPixel> RgbImage;

然后我使用2 for循环来遍历帧像素阵列,例如:

for (int i = ymin; i < ymax; i++) 
{
    for (int j = xmin; j < xmax; j++) 
    {
        int r = image[i][j].r;
        int g = image[i][j].g;
        int b = image[i][j].b;

所以我想说我想抛出一个IF语句来检查像素数据的颜色 . 我已经看到一些网站将它们列为类似的东西

image[i][j].r=0xFF;

or if g < 0x20

我不习惯看十六进制的值,我试图查找它们但找不到任何引用,我习惯了cvscalars,那么这些意味着什么呢?喜欢0x20代表什么?或者0xFF呢?

谢谢

2 回答

  • 2

    你看到的 0x00 ... 0xFF 的范围是一个 byte ,它可以保存 0 and 255 之间的值,这是像素颜色数据的存储方式,通常是3或4个字节,包括红色,蓝色,绿色和可选的Alpha .

    CvScalar 只是一个1,2,3或4个双打的便利容器,可用于以稍微不同的形式保存这些值 .

    例如:

    cv.RGB(1.0, 0.5, 0.3) 将颜色的红色分量设置为 1.0 or 100% ,将绿色分量设置为 0.5 or 50% ,将蓝色分量设置为 0.3 or 30% . 当创建实际的颜色结构时,这些组件中的每一个都将由一个 byte 组成,因此这与设置

    R(红色成分)到 1.0 * 0xFF = 0xFF

    G(绿色成分)至 0.5 * 0xFF = 0x7F

    B(蓝色成分)到 0.3 * 0xFF = 0x26

    alpha自动设置为 1.0 or 0xFF

  • 0

    十六进制只是数字的另一种表示(基数为16) .

    这不是很难习惯,你只需要学习如何转换为常规基数为10的数字 . 打开你最喜欢的Windows / mac计算器,切换到Hex模式,然后输入FF . (0x前缀只告诉代码它是十六进制数)

    切换到Dec [imal],数字将更改为255.键入32 in,在十进制模式下,然后单击十六进制,您将看到数字更改为20(或代码中的0x20)

    现在你可以从十六进制到十进制,你可以很容易地从十进制到标量;只需转换范围;

    float Scalar = static_cast<float>( Decimal ) / 255.f; // 255 being the largest value for your byte-colour

    享受Hex!你会发现它是一种非常有用,整洁和重要的数据查看方式 .

相关问题