十六进制的OpenCV RGB值?
Posted
技术标签:
【中文标题】十六进制的OpenCV RGB值?【英文标题】:OpenCV RGB values in hex? 【发布时间】:2010-11-17 08:30:10 【问题描述】:所以我已经使用 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 呢?
谢谢
【问题讨论】:
【参考方案1】:您看到的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
【讨论】:
【参考方案2】:十六进制只是数字(以 16 为底)的另一种表示形式。
习惯起来并不难,您只需要学习如何与常规的以 10 为基数的数字相互转换即可。 打开你最喜欢的 windows/mac 计算器,切换到十六进制模式,然后输入 FF。 (0x 前缀只是告诉代码它是十六进制数)
切换到 Dec[imal],数字将变为 255。 在十进制模式下输入 32,然后单击十六进制,您会看到数字变为 20(或代码中的 0x20)
现在你可以从十六进制转换为十进制,你可以很容易地从十进制转换为标量;只需转换范围即可;
float Scalar = static_cast<float>( Decimal ) / 255.f; // 255 being the largest value for your byte-colour
享受十六进制!您会发现它是一种非常有用、简洁且重要的数据查看方式。
【讨论】:
以上是关于十六进制的OpenCV RGB值?的主要内容,如果未能解决你的问题,请参考以下文章