自适应屏幕主题的氛围灯设计
2018-04-25文渊汪玉坤张保平
文渊 汪玉坤 张保平
摘 要:现如今各个领域都开始用灯光吸引着别人的眼球。带有灯光渲染的产品更容易吸引客户的目光,自适应主题氛围灯可以结合屏幕上的主色调来调整氛围灯的颜色,该氛围灯的设计是C#上位机实时采集屏幕内所有像素点的RGB值,经过主色调提取算法得到主色调的数值,通过串口与RGB灯的STM32微处理器进行数据传输,控制RGB灯的颜色变化,达到自适应主题的氛围灯效果。
关键词:氛围灯;主色调;串口通信
中图分类号:U463.65 文献标志码:A 文章编号:2095-2945(2018)11-0033-03
Abstract: Now all fields are beginning to attract the attention of others with lights. Products with lighting rendering are more likely to attract customers' attention. The adaptive themed atmosphere lamp can be combined with the main tone on the screen to adjust the color of the atmosphere lamp, which is designed by capturing the RGB value of all pixels on the screen in real time by the C# host computer, getting the value of the main tone through the main tone extraction algorithm, through the serial port and the STM32 microprocessor of the RGB lamp for data transmission, so as to control the color change of the RGB lamp and achieve the effect of adaptive theme atmosphere lamp.
Keywords: atmosphere lamp; main tone; serial communication
1 概述
隨着LED技术的不断发展,灯光的渲染已被各个电子厂商加入到自己的产品中,但是真正结合显示器色调的氛围灯几乎处于空白,所以氛围灯的设计方法具有一定的应运前景,无论是商业使用的大型led广告牌还是家中的电视、投影、显示器都可以通过自适应屏幕主题氛围灯的设计增强商业广告和家庭显示器的显示效果,并且为了提供给用户更好视觉体验在设计中提出了一套醒目主色调的提取算法。最后本文从上位机的颜色提取,对RGB三色灯驱动和控制,以及上位机与STM32微处理器的串口通信几大方面做论述。
2 总设计方案
该方案由取色上位机的设计和RGB灯的控制系统两部分组成。取色上位机是基于C#语言在Vidual Studio 2016做开发。RGB灯的控制系统包括WS2118驱动芯片和STM32f103c8t6微处理器。
总设计流程是PC端上位机进行颜色提取与主色调分析,STM32做下位机通过串口通信的方式接收数据并对RGB三色灯带进行控制。
3 各个功能模块的设计与实现
3.1 上位机的设计
该上位机是在visual studio 2016的开发环境下进行设计。visual studio 2016是微软公司2016年发布的一款全新的集成环境包软件,适用于多种语言。其中NETFramework.的 WindowsForms模块可以用更有效的开发桌面应用。visual studio 2016可以在编写代码时提供实时指导随着键入描述API,并使用自动完成功能以提高速度和精确度。灯泡图标有助于发现并修复常见编码问题,在许多情况下,可以一边键入代码,一边“实时”地获取帮助,并在编辑器内直接快速执行代码操作。
3.1.1 控件设计
控件ComboBox1
ComboBox是编辑框(Edit)和列表框(List)的组合。它提供了多种输入方式,可根据具体需要选择使用纯列表选择方式、纯文本编辑输入方式或者编辑输入和列表选择混合方式。
在此设计中用于串口和波特率选择的下拉框设计,在上位机于下位机连接时点击串口框和波特率框都会弹出下拉菜单选择当前串口和波特率。其中Items属性用于添加下拉列表里的元素。Text属性用于显示初始状态下该控件框的文本。
控件PictureBox
PictureBox控件是用来呈现图像,图像资源可以来自文件,也可以是存在内存中的位图对象。可以显示本地图像文件或来自网络的图片,也可以来自项目文件中的图像。
在此设计中用于显示经过主色调提取算法后的颜色,BackColor属性用于获取或设置该控件背景颜色,因此将最终的RGB值赋予该属性就能实现其功能。
控件SerialPort
SerialPort控件用于控制串行端口文件资源。此类提供同步I/O和事件驱动的I/O、对管脚和中断状态的访问以及对串行驱动程序属性的访问。另外,此类的功能可以包装在内部Stream对象中,可通过BaseStream属性访问,并且可以传递给包装或使用流的类。在此设计中用于上位机和STM32单片机的串口通讯。BaudRate属性用来设置串行波特率,BytesToWrite属性用于设置发送缓冲区的字节数,RtseEnable属性设置为False则在通信过程中不会请求发送(RTS)行。
3.1.2 屏幕图像的捕获
(1)首先要创建一个和当前屏幕大小相同的Bitmap对象, 要实现此操作,首先就要现获得当前显示器的DC,然后根据此DC来创建Graphic对象,再由此Graphic对象产生此位图对象。(2)根据此位图创建一个和其一样的Graphic对象。(3)捕获当前屏幕: 我们是通过当前屏幕保存到创建的位图对象中来实现的,具体的实现过程是通过Windows的一个API函数——Bitblt。
3.1.3 RGB值获取方法
C#数字图像处理有3种典型方法:提取像素法、内存法、指针法。指针法直接应用指针来对图像进行处理,速度最快。故在此软件设计中采用指针法获取图像中的RGB值。默认情况下,C# 不支持指针运算。不过,通过使用 unsafe 关键字,可以定义可使用指针的不安全上下文。
//创建图像
Bitmap image = new Bitmap( "c://images//image.gif" );
//获取图像的BitmapData对像
BitmapData data = image.LockBits( new Recta4ngle( 0 , 0 , image.Width , image.Height) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb );
//循环处理
unsafe
{ byte* ptr = ( byte* )( data.Scan0 );
for( int i = 0 ; i < data.Height ; i ++ )
{ for( int j = 0 ; j < data.Width ; j ++ )
{ ptr += 3; }
ptr += data.Stride - data.Width * 3;
} }
3.2 主色调提取算法
找出一张图片中的主色调,这里的主色调并不是指颜色最多的,而是指最一幅图像中最“醒目”的颜色。(1)计算整个图片的色调的平均值 (avg_hue)。(2)遍历每个像素,计算该像素的色调值与avg_hue 的色差(即将二者相减后取绝对值),如果该色差大于一个阈值,则将该像素加入到“醒目像素”的数组。(3)计算整个“醒目像素列表”的颜色均值,得到的结果即为该图片的主色调。
//色差大于閾值的颜色值
var rgbs = new List
for (int h = 0; h < bitmap.Height; h++)
{ for (int w = 0; w < bitmap.Width; w++)
{ var color = bitmap.GetPixel(w, h);
var hue = color.GetHue();
//如果色差大于阈值,则加入列表
if (Math.Abs(hue - avg_hue) > threshold)
{ rgbs.Add(color);
} } }
if (rgbs.Count == 0)
return Color.Black;
//计算列表中的颜色均值,结果即为该图片的主色调
int sum_r = 0, sum_g = 0, sum_b = 0;
foreach (var rgb in rgbs)
{ sum_r += rgb.R;
sum_g += rgb.G;
sum_b += rgb.B;
} return Color.FromArgb(sum_r / rgbs.Count,
sum_g / rgbs.Count,
sum_b / rgbs.Count)
}
3.3 RGB灯带驱动控制
WS2811芯片是三通道LED驱动控制专用电路,芯片内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和15V高压可编程定电流输出驱动器。
芯片在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个芯片提取后,送到芯片数据锁存器,剩余数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的芯片,每经过一个芯片的传输,信号减少24bit。
3.4 串口通信设计
该氛围灯设计中,采用串口通信实现对RBB灯的控制,PC端软件作为上位机、单片机作为下位机组成的数据通信系统。
在上位机软件设计中使用System.IO.Port.SerialPort类实现串口通信System.IO.Port.SerialPort是.NET Framework提供的操作串行端口的类,里面提供了一些方法、属性和和事件供开发者调用操作串口。设计过程中首先接调用SerialPort的静态方法GetPortNames()获取当前计算机的串行端口名称数组再根据串口名称,初始化SerialPort对象,设置参数,调用Open()方法打开串口,调用Write()方法发送数据。最后注册接收数据的监听,获取数据(或者另起线程循环读取接收数据)。
在硬件搭建设计中采用USB转TTL串口通讯模块,电脑用的一般是RS232串口,电子设备一般用TTL串口。两者只是高低电平的电压不同。TTL表示电压变化范围为0-5v。所以运用此模块将上位机的控制数据发送给单片机下位机达到对氛围灯的实时调色控制。
4 结束语
本设计中上位机采用的指针法获取图像中颜色,经过测试速度达到要求,可实现实时取色的效果,主色调提取算法也提取最醒目的颜色并能通过RGB灯显示。该设计紧跟人们未来的需求趋势,在一件产品功能完善的同时追求更高的使用体验,具有一定应用意义。
参考文献:
[1]曹阳.基于触摸按键和PWM驱动配色的汽车氛围灯[J].电子技术,2015(12):1-3.
[2]王敏,李斌桥,徐江涛.基于色温估计的自动白平衡算法研究[J].光电子·激光,2011(12):1872-1875.
[3]周航慈.单片机程序设计基础[M].北京:北京航空航天大学出版社,2003.
[4]陈小龙,孙逊之,董伟,等.一种多模式的氛围灯控制模块[J].汽车零部件,2017(02):15-19.
[5]王向阳.胡峰丽,杨红颖.一种基于区域绦合特征的彩色I圭I像检索方法[J].小型微型计算机系统,2007,28(2):351-355.
[6]刘军,张洋,严汉宇.原子教你玩STM32(库函数版)[M].北京:北京航空航天大学出版社,2013.