所以我使用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呢?
感谢
答案 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!你会发现它是一种非常有用,整洁和重要的数据查看方式。