十六进制的OpenCV RGB值?

时间:2010-11-17 08:30:10

标签: c++ image-processing opencv

所以我使用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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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!你会发现它是一种非常有用,整洁和重要的数据查看方式。