最近收到2只热电堆准列传感器,准备测试下性能
看到各论坛好多大神自己做的热像仪,羡慕的很。
自己做才发现屏幕显示部分还有不少功课要补,RGB适合机器显示,而人眼的感受更适合用HSV来描述:亮度,饱和度,色相。
详细转换公式及工具
另一方面,小屏幕一般是565格式,而不是完整RED256,G256,B256,实际使用时需要按比例压缩:
#define RGB24TORGB16(R,G,B) ((unsigned short int)((((R)>>3)<<11) | (((G)>>2)<<5) | ((B)>>3) ))
转换C程序(转自)
//! hsb结构体
typedef struct
{
//! h(色相)
float h;
//! s(饱和度)
float s;
//! b(亮度)
float b;
}hsb_t;
//! rgb结构体
typedef struct
{
//! r(红色)百分比
float r;
//! g(绿色)百分比
float g;
//! b(蓝色)百分比
float b;
}rgb_t;
void hsb_to_rgb(hsb_t * hsb, rgb_t * rgb)
{
int i;
float f, p, q, t, r, g, b;
float h = hsb->h, s = hsb->s / 100, v = hsb->b / 100;
if( s == 0 )
{
rgb->r = rgb->g = rgb->b = hsb->b;
return;
}
h /= 60; // sector 0 to 5
i = (int)h;
f = h - i; // factorial part of h
p = v * ( 1 - s );
q = v * ( 1 - s * f );
t = v * ( 1 - s * ( 1 - f ) );
switch( i ) {
case 0:
r = v;
g = t;
b = p;
break;
case 1:
r = q;
g = v;
b = p;
break;
case 2:
r = p;
g = v;
b = t;
break;
case 3:
r = p;
g = q;
b = v;
break;
case 4:
r = t;
g = p;
b = v;
break;
default: // case 5:
r = v;
g = p;
b = q;
break;
}
rgb->r = r ;//* 100;
rgb->g = g ;//* 100;
rgb->b = b ;//* 100;
}
部分测试代码
hsb_t hsv;
rgb_t rgb;
lcd_y = 0;
hsv.b = 100;
hsv.s = 100;
for(int i = 0; i < 360; i++)
{
hsv.h = i;
rr = rgb.r*255;
gg = rgb.g*255;
bb = rgb.b*255;
uint8_t update_flag = 1;
{
static uint16_t cu_color = 0;
hsb_to_rgb(&hsv, &rgb);
color = RGB24TORGB16(rr, gg, bb);
{
if(lcd_y < 320)
{
LCD_Rectangle(lcd_y++, 160, 1, 50, color);
HAL_Delay(10);
}
cu_color = color;
color_space[lcd_y] = color;
}
}
}
核心代码就这些,懒得拍照上传了,成功的话可以看到板子上的彩虹色带