STM32热像仪——TFT颜色处理(HSV转RGB)

最近收到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;
                }
            }
        }

核心代码就这些,懒得拍照上传了,成功的话可以看到板子上的彩虹色带

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值