有没有哪位用stm32做颜 {MOD}识别的!求助啊

2019-07-14 23:44发布


我用32识别魔方颜 {MOD},用的是RGB转HSI识别魔方颜 {MOD},
发现橙 {MOD}和红 {MOD}非常难分辨别,转换后的红 {MOD}、橙 {MOD}S 和 I值基本没多大差别,
H值红 {MOD}在32以下,橙 {MOD}在28----40之间,有重复,总是容易出错,怎么解决啊!
求高人指点,能通俗讲解最好!  



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
xshenpan
2019-07-16 17:29
本帖最后由 xshenpan 于 2014-5-12 10:35 编辑
shixiaogang 发表于 2014-5-11 20:57
RGB是如何实现转HSI的啊?求楼主给我一下代码,我也在做颜 {MOD}识
  1. #define min3v(v1, v2, v3)   ((v1)>(v2)? ((v2)>(v3)?(v3):(v2)):((v1)>(v3)?(v3):(v1)))
  2. #define max3v(v1, v2, v3)   ((v1)<(v2)? ((v2)<(v3)?(v3):(v2)):((v1)<(v3)?(v3):(v1)))

  3. typedef struct hsicolor
  4. {
  5.         int16_t        H;
  6.         int16_t        S;
  7.         int16_t        I;
  8. }HSI_ColorTypeDef;

  9. typedef struct rgbcolor
  10. {
  11.         u8        R;
  12.         u8        G;
  13.         u8        B;
  14. }RGB_ColorTypeDef;

  15. //公式参考http://blog.sina.com.cn/s/blog_a5b3ed560100yo26.html
  16. // H>=0 && H<=360                S>=0 && S<=100                I>=0 && I<=100

  17. HSI_ColorTypeDef RGB565ToHSI(u16 rgb)
  18. {
  19.         u16 Max,Min;
  20.         float delta;
  21.         RGB_ColorTypeDef        RGBColor;
  22.         HSI_ColorTypeDef        HSIColor;
  23.        
  24.         RGBColor.R         = ((rgb & 0xf800) >> 8);                       
  25.         RGBColor.G         = ((rgb & 0x07e0) >> 3);
  26.         RGBColor.B         = ((rgb & 0x001f) << 3);                        //将RGB565化为RGB888
  27.        
  28.         Min = min3v(RGBColor.R,RGBColor.G,RGBColor.B);
  29.         Max = max3v(RGBColor.R,RGBColor.G,RGBColor.B);
  30.         delta = Max - Min;
  31.        
  32.         if(Max == RGBColor.R)
  33.                 HSIColor.H = (int16_t)(60.0f*((RGBColor.G-RGBColor.B)/delta));
  34.         else if(Max == RGBColor.G)
  35.                 HSIColor.H = (int16_t)(60.0f*((RGBColor.B - RGBColor.R)/delta))+120;
  36.         else //if(Max == RGBColor.B)
  37.                 HSIColor.H = (int16_t)(60.0f*((RGBColor.R - RGBColor.G)/delta))+240;
  38.        
  39.         if(HSIColor.H < 0)
  40.                 HSIColor.H+=360;
  41.        
  42.         HSIColor.I = (int16_t)((Max + Min)*0.1961f);                                                        //I = (int16_t)((Max + Min)*1.0f/2/255.0*100);
  43.        
  44.         if(HSIColor.I <= 50)
  45.                 HSIColor.S = (delta/(Max + Min))*100;
  46.         else
  47.                 if(Max != 255 || Min != 255)
  48.                         HSIColor.S = delta*100.0f/(510 - (Max + Min));
  49.                 else
  50.                         HSIColor.S = 0;
  51.                
  52.         return HSIColor;
  53. }
复制代码

一周热门 更多>