对于半自动个人电脑光标定位系统的介绍【精品推荐-doc】
对于半自动个人电脑光标定位系统的介绍
江苏省南京市金陵中学 周辰 摘 要,通过使用无线摄像头对眼部图像进行实时采集分析来控制个人电脑光标定位及发送命令,帮助手部残疾人士操作电脑光标。系统对采集到的眼部图像进行转换,模糊,二值化,热区选取等工作,提取出瞳孔中心位置。并根据系统初始化建立的模型,判断使用者当前注意的区域,放置光标。
Abstract,
Semi-Auto Eye to Mouse System Advanced (ETMS) Abstract: (ETMS) produces image analysis in the eyes through wireless
photography to control PC cursor and send orders so as to help the
hand-handicapped to use the cursor. The system analyze the eye image by
fuzzy algorithm and then transforms the image to the two-value image, to
get the user’s fixating part and moves the mouse automatically.
关 键 词,计算机视觉,图象处理,辅助工具,人机交互
Key Words,Computer Vision,Image Manipulation,,Man-Machine Interaction
前 言,
电脑自从进入使用GUI的时代以来,鼠标便逐渐成为电脑操作中不可或缺的输入工具,其重要性对于部分初级使用者来说甚至高于键盘。的确,在进行某些操作时,鼠标其输入效率要远高于键盘。但从另一方面来讲,当使用者无法使用鼠标时,输入便会变得极为不便——对于手部残疾者来说这点尤为突出——因为他们除了无法使用鼠标以外,也无法使用键盘。这造成的直接后果是,对于此类人群,操作计算机便是“不可能完成的任务”。 除此之外,传统鼠标还有一项缺点,便是长时间使用会对腕部肌肉造成物理性伤害,令使用者产生酸痛感,严重时甚至造成长期性的难以治愈的肌肉疾病。此点已得到医学研究证明。 出于此类原因,我认为我们迫切的需要一种新的技术来解决此问题。即使用另一种输入设备来代替鼠标,帮助使用者来操作电脑的光标。
眼睛可以做到这一点。因为电脑最主要的输出设备无疑是显示器。对于任何使用者,离了别的输出设备是可以使用电脑的,单显示器不行。而我们接受显示器输出信息的器官是眼睛。也就是说,无论如何使用电脑,我们必须使用眼睛来接受电脑反馈的信息。于是相应的,若我们的眼睛可以接受电脑反馈的信息,那我们的眼睛也可以提供信息告知电脑我们如何使用电脑。
正 文,
系统硬件构成,
1. 无线摄像头一套(自带红外,黑白),模拟信号; 2. 外接视频采集盒一个(USB接口);
(将模拟信号转为数字信号)
系统软件构成,
1. ETMSA(Auto)-UI 2. ETMSA(Auto)-Cap (UI:User Interface,用户界面) (获取图像并对光标进行操控)
系统初始化,
由于此系统模型建立的特点,在每次使用前需对系统进行初始化。
通过系统初始化,可建立位置对应模型,以方便之后的使用过程中光标的放置。
瞳孔中心位置判断算法模块,
程序将实时采集使用者眼部图片。获得图片后,本程序需先将图片转为灰阶数组,即值的范围为0~255,尺寸与原图片相同。此转换需获取每点RGB分量值。为了加快速度,使用LockBits
函数,锁定并读取此段内存,直接获得各点各分量的Byte型值。处理一幅320*240的Bitmap用此函数需耗时0.01秒,较使用GetPixel的0.16秒更具效率。 此部分代码为:
Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(rect,
Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format24bppRgb)
Dim ptr As IntPtr = bmpData.Scan0
Dim numBytes As Integer = rect.Width * rect.Height * 3
Dim rgbValues(numBytes) As Byte
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, numBytes)
即将Bitmap型变量每点各分量复制入Byte型数组。
RGB颜色模型
由于使用摄像头为黑白,图片中所有值均为灰度。根据RGB颜色模型,所有灰度值均在正方体的对角线上,也就是说R、G、B三者值相同。因此转灰阶时,只需抽取这三者中的任意一个。又由于此时数组为一维,所以之后需进行以下操作:
Dim bmArrayS(rect.Width, rect.Height) As Short
Dim t As Integer
For h As Short = 0 To rect.Height - 1
For w As Short = 0 To rect.Width - 1
bmArrayS(w, h) = 256 - rgbValues(t) : t += 3
Next
Next
即每隔两点在一位数组里去一个值,排列在新建的二维数组内。新建二维数组与原图具有相同尺寸。
这时的二维数组便是原图灰阶的量化数组。此转化即将图片转为Short型数组,可利于后期处理素的的加快。
接下来,为了降低图片中噪音点对结果的影响,采用了模糊算法,即对3*3的范围内取均值。实际测试结果显示,该算法不但可洗去图片中噪音点,还可使各色块边缘较为圆滑。
原图
未经过模糊处理
经过模糊处理
此部分代码为:
Dim colaverage As Short
For m = 1 To rect.Width - 2
For n = 1 To rect.Height - 2
colaverage = Int((bmArrayS(m - 1, n - 1) + bmArrayS(m, n - 1) + bmArrayS(m + 1, n - 1) + bmArrayS(m - 1, n) + bmArrayS(m, n) + bmArrayS(m + 1, n) + bmArrayS(m - 1, n + 1) + bmArrayS(m, n + 1) + bmArrayS(m + 1, n + 1)) / 9)
bmArrayS(m - 1, n - 1) = colaverage : bmArrayS(m, n - 1) = colaverage : bmArrayS(m + 1, n - 1) = colaverage : bmArrayS(m - 1, n) = colaverage : bmArrayS(m, n) = colaverage : bmArrayS(m
+ 1, n) = colaverage : bmArrayS(m - 1, n + 1) = colaverage : bmArrayS(m, n + 1) = colaverage : bmArrayS(m
+ 1, n + 1) = colaverage
Next n, m
此后便须将数组进行二值化处理,转为Boolean型数组,即True or False。此操作可减少甚至消除图片中图片中的大量无效信息。当然二值化处理的使用也是具有条件的,即关注区域灰度较为稳定,或存在一定规律性。
(为更好的表示处理效果,后面的黑白单色图中黑色为True,白色为False。)
这时在阀值的选取上便有很大的学问,因为选取不同的阀值往往对处理结果会有很大的影响。下面的图可以很好的说明该问题:
原图(真彩色) 以170为阀值二值化
以190为阀值二值化 以180为阀值二值化
以200为阀值二值化 以210为阀值二值化 若以170为阀值,则信息的损失最少,但同时,得到的无效信息也越多,如最左边的大片黑色区域, 该区域会对结果产生很大影响,而且瞳孔周围仍有很多会对结果产生或多或少黑点;若以190为阀 值,瞳孔周围的黑点消失了,但左侧黑色色块依然存在;若以210为阀值,左侧黑色色块消失了,但 与此同时,瞳孔中的很多有效点也将被过滤掉,这有可能造成程序最后无法取得任何有效值。
瞳孔的颜色相对其他区域是稳定的,一般都在200以上。据此,可通过二值化将瞳孔与眼球周
围区域区别开,即提取出瞳孔区域。
二值化代码为:
Dim bmArrayB(rect.Width, rect.Height) As Boolean
For m = 0 To rect.Height - 1
For n = 0 To rect.Width - 1
If bmArrayS(n, m) >= fa Then
bmArrayB(n, m) = True
Else
bmArrayB(n, m) = False
End If
Next n, m
经过这些处理,计算结果还有可能被图片边角的连续性黑色色块干扰(如经过模糊处理的效果
显示图片中的左图的左上角的小面积黑区)。针对这些无效区,增加了一块自己命名为“去边角”
的算法,作用为洗去图片边角连续的无效黑色区域。这样便可得到瞳孔的大致区域。
“去边角”代码为:
For n = 0 To rect.Height - 1
For m = 0 To rect.Width - 1
If bmArrayB(m, n) Then
bmArrayB(m, n) = False
Else
Exit For
End If
Next
For m = rect.Width - 1 To 0 Step -1
If bmArrayB(m, n) Then
bmArrayB(m, n) = False
Else
Exit For
End If
Next
Next
For n = 1 To rect.Width - 2
For m = 0 To rect.Height - 1
If bmArrayB(n, m) Then
bmArrayB(n, m) = False
Else
Exit For
End If
Next
For m = rect.Height - 1 To 0 Step -1
If bmArrayB(n, m) Then
bmArrayB(n, m) = False
Else
Exit For
End If
Next
Next
这之后便可算出瞳孔大致中心。此时采用的算法可以叫做单线扫描。程序从Boolean型数组第
一横行逐点扫描,在第一次扫倒点的横行记一次,再到第一次没扫倒点的横行记一次,取两次
均值。竖行同理。虽说该算法会在图片有两块黑色区域时产生错误(例如眼角处也取得较大黑
区),但这种机率较小。
第一次取中心代码为:
Dim x1, x2, y1, y2 As Short
Dim ifFound As Boolean
ifFound = False
For m = 0 To rect.Height - 1
If ifFound = False Then
For n = 0 To rect.Width - 1
If bmArrayB(n, m) = True Then
y1 = m
ifFound = True
Exit For
End If
Next
Else
Dim falsetime As Short = 0
For n = 0 To rect.Width - 1
If bmArrayB(n, m) = False Then falsetime += 1
Next
If falsetime = rect.Width Then y2 = m : ifFound = False : GoTo 20 End If
Next
20:
For m = 0 To rect.Width - 1
If ifFound = False Then
For n = 0 To rect.Height - 1
If bmArrayB(m, n) = True Then
x1 = m
ifFound = True
Exit For
End If
Next
Else
Dim falsetime As Short = 0
For n = 0 To rect.Height - 1
If bmArrayB(m, n) = False Then falsetime += 1
Next
If falsetime = rect.Height Then x2 = m : ifFound = False : GoTo 30 End If
Next
30:
此时取得的瞳孔中心与真实值相比,存在一定偏移。对此较为简单的解决方法当然是适当降低阀值。但若这样带来的问题也显而易见,即边角处无效点的增多。为解决此问题,采用的是对热区二次处理的方法,即在通过之前的处理之后,获得瞳孔中心大致位置,之后再以此位置为中心,自动选择一块矩形区域。在此区域内降低阀值再二值化处理一次。这样一来即可获得较多有效值,又可降低取得边角处无效值得机率。 选取热区代码为:
Dim x1C, x2C, y1C, y2C As Short
x1C = x1 * 2 - x2
If x1C < 0 Then x1C = 0
x2C = x2 * 2 - x1
If x2C > rect.Width - 1 Then x2C = rect.Width - 1
y1C = y1 * 2 - y2
If y1C < 0 Then y1C = 0
y2C = y2 * 2 - y1
If y2C > rect.Height - 1 Then y2C = rect.Height - 1
Dim bmHotB(x2C - x1C + 2, y2C - y1C + 2) As Boolean
For m = 0 To y2C - y1C + 1
For n = 0 To x2C - x1C + 1
If bmArrayS(n + x1C, m + y1C) >= fa - 10 Then
bmHotB(n, m) = True
Else
bmHotB(n, m) = False
End If
Next
Next
在此处理之后,程序将重新计算一次热区的黑区中心。这次的中心与之前的相比较为准确。
第二次选取中心代码为:
For m = 0 To y2C - y1C + 1
If ifFound = False Then
For n = 0 To x2C - x1C + 1
If bmHotB(n, m) = True Then
y1 = m
ifFound = True
Exit For
End If
Next
Else
Dim falsetime As Short = 0
For n = 0 To x2C - x1C + 1
If bmHotB(n, m) = False Then falsetime += 1
Next
If falsetime = x2C - x1C + 2 Then y2 = m : ifFound = False : GoTo 40
End If
Next
40:
For m = 0 To x2C - x1C + 1
If ifFound = False Then
For n = 0 To y2C - y1C + 1
If bmHotB(m, n) = True Then
x1 = m
ifFound = True
Exit For
End If
Next
Else
Dim falsetime As Short = 0
For n = 0 To y2C - y1C + 1
If bmHotB(m, n) = False Then falsetime += 1
Next
If falsetime = y2C - y1C + 2 Then x2 = m : ifFound = False : GoTo 50 End If
Next
50:
此时获得的中心为热区相对坐标,还需转化为全图坐标。 此部代码为:
FindPointWithLockbits.X = (x2 - x1) \ 2 + x1C + x1 + 2 + rect.X
FindPointWithLockbits.Y = (y2 - y1) \ 2 + y1C + y1 + 2 + rect.Y
使用P?M1.9G 640MB测试,采用此算法系统光标位置刷性率约为每秒10帧。
用眼睛发送类似于鼠标单击的命令,
为了尽量脱离鼠标,本系统“单击”命令也将是用眼睛发送。此事件具体定义为,当鼠标在某一可以接受单击命令的区域内停留两秒,系统自动发送一个单击命令到目标区域。
特制的UI,
ETMSA(Auto)-UI的各按钮均较大。这是因为本系统目前精准度并未达到可控制常见操作系统的要求,在此情况下大按钮可使操作更为简单。
本UI目前具有以下功能:
• 图片浏览(自动加载“我的文档”中“图片收藏”内的JPG文件,“上”/“下”浏览上
一幅/下一幅)
• 文本浏览(自动加载桌面上的TXT文件,“上”/“下”浏览上一篇/下一篇)
• 资源管理(磁盘查看,类似于Windows资源管理器)
• 计算器
• 游戏
• Mp3播放(自动加载My Music
下Mp3文件,依次播放)
• 时间显示
(其他功能将在以后逐渐增加)
至此,系统初级版本基本介绍完毕。但由于系统模型还未健全及瞳孔中心位置判断算法还未达到全适应、自适应,仍有可能返回偏移值甚至错误值,光标在屏幕上的自动定位还或多或少的存在不同程度上的误差或错误。实际使用时光标定位与使用者实际注视部位一般会有不超过1.5cm的偏移,这使目前该系统的使用与实际操作一般常见操作系统存在一定差距。也正是因此,
了专用UI,间接解决了光标定位不够准确的问题。