三维交互技术算法及FPGA实现.docx
《三维交互技术算法及FPGA实现.docx》由会员分享,可在线阅读,更多相关《三维交互技术算法及FPGA实现.docx(18页珍藏版)》请在冰豆网上搜索。
三维交互技术算法及FPGA实现
三维交互技术算法及FPGA实现
概述:
本算法设计主要采用双摄像头,基于双目视觉技术来定位3维手势。
图像采集输入:
图像输入只采集亮度信号,并且经过二值化,只采集255和0图像。
存入到sdram。
手部边缘提取
总体思路如下:
(1)对获得的图像进行腐蚀。
使用7*7的结构元,得到pHand
(2)然后再对腐蚀得到的图像进行膨胀。
使用7*7的结构元,得到pHandOpen。
(3)对pHandOpen进行腐蚀运算。
使用3*3结构元,得到pErode。
(4)使用pHandOpen减去pErode,得到手部边缘,记为pHand。
连通域判断
总体思路如下:
对边缘提取的图像进行漫水填充,使用areaNum对连通区域的个数进行计数
漫水填充算法:
1.逐行扫描,当碰到第一个非0数据时(红色格),使用四连通进行填充,并且逐行进行,直到把这个连通域填充完毕,并把这个区域设为值1。
2.继续逐行扫描,碰到非0和非1的数据时(绿色格),使用四连通进行填充,并且逐行进行,直到把这个连通域填充完毕,并把这个区域设为值2.
3.以此类推……
NOTE:
这里最多能有256个连通区域,值得注意
算法实现考虑:
考虑一个3*2窗口:
P为像素值,为0或1.
考虑块的标记值:
如下:
由这里看出,需要存储由标记值标记灰度的图像。
以便后来进行去除其它干扰点时使用。
以及在做标记处理的时候。
必须同步读取标记好的数据。
从头搜索像素:
第一个点或第一行,左边点和上边点扩充0值。
其他空白处不考虑。
标记值初始化为1:
连通域像素点个数计数值:
开辟一个数组Sum[]:
同时开辟等价关系数组K:
等价关系数组为1个下标代表联通块,数组值代表这块标记的灰度值,如果两块的灰度标记值相等,则认为这两块是连通的。
下面用lab()来表示K数组里面的值。
1.Pn(0)如果为0.则窗口继续移动,如果1:
判断ifPn(0)=Pn-1(0),则Ln(0)=Ln-1(0)
ElseifPn(0)=Pn
(1)则Ln(0)=Ln
(1),else都不等:
Pn(0)=Z,把Z写入Z为下标的K数组,Z++;计数:
判断ifPn(0)=Pn-1(0),则下标为Ln-1(0)的Sum数组值+1;ElseifPn(0)=Pn
(1)则Ln
(1)的Sum数组值+1.
2.两个块等价关系判断:
如果Pn(0)=Pn
(1),Ln(0)!
=Ln
(1)而说明这两块是等价的。
Ln(0)和Ln
(1)标记是等价的。
步骤一:
如果Ln(0)>Ln
(1):
并且lab(Ln(0))=Ln(0)则说明Ln(0)块还未与其他块相连,或者是相连块里面标记最小的。
则Lab(Ln(0))=lab(Ln
(1)),让其与Ln
(1)块相连。
如果Lab(ln(0))!
=Ln(0),则证明Ln(0)块已经于其他块相连,因此需要找到这一个块中标记最小得块,即Lab(t)=t的块,t为块标记。
这里我们采取追踪标记的办法,令t=Lab(ln(0));即t是与lab(Ln(0))块相连的块,如果lab(t)=t则t块就是最小的块,以t和Ln
(1)块比较。
然后再重复步骤一:
步骤二:
Ln(0)(1):
并且lab(Ln
(1))=Ln
(1),则说明Ln
(1)还未与其他块相连,或是相连块中最小标记的。
则lab(Ln
(1))=Ln(0)。
如果lab(Ln
(1))!
=Ln
(1),则证明Ln
(1)块已经于其他块相连,因此需要找到这一个块中标记最小得块,即Lab(t)=t的块,t为块标记。
这里我们采取追踪标记的办法,令t=Lab(ln
(1));即t是与lab(Ln
(1))块相连的块,如果lab(t)=t则t块就是最小的块,否则继续追踪,然后以t和Ln(0)块比较。
然后再重复步骤一:
3.遍历等价关系表数组,以(标记值内的值)作为数组下标的单元的值去跟新原值:
用C语言表示即:
*p=*(*p)。
4.把每个等价的计数单元相加,找出最大值。
5.根据等价关系数组更新图像。
6.把除最大连通域部分图像清零。
保留最大的连通分量
总体思路如下:
如果areaNum的值为零,代表这帧图像中没有连通域,则直接返回零值。
如果areaNum不为零,进行逐行扫描,建立一个数组pAreaPixs[j],比较当前像素的pTemp[j]和areaNum的大小,如果pTeam[j]的值小于等于areaNum的值且pTeam[j]的值大于零,则pAreaPixs[pTeam[j]-1]加一。
此时pTeam[j]的值为上一步中区域的赋值,扫描结束整副图像,最后得到一个数组,其中的最大值为连通域的最大值maxLen,进而得到最大连通域的maxIndex(实际上也是areaNum-1)。
通过判断pTemp[j]和maxIndex+1的值是否相等,来标记出最大的连通分量,作为手指的区域。
提取指尖坐标
思路如下:
如果没有连通分量,直接返回;有连通分量,寻找轮廓的起始点,遍历所有轮廓点,并将这些点的坐标保存在数组中通过对轮廓曲率的变化找到小于阈值的边缘点进一步对这些边缘点进行判断,得到指尖坐标
(4)、(5)步骤如图所示:
通过判断角度
得到边缘点,使用T判断边缘点是否为指尖点。
从最后一行开始扫描:
得到第一个点后,判断该点的上,下,左,右。
这里可以做一个状态机来实现;
状态1:
扫描得到第一个点。
存储该点坐标,转到状态2
状态2:
扫描该点的右边点:
如果该点为1:
则如果该点为上一个点,转到状态3,如不是:
存储该点坐标,转到状态1。
否则转到状态3.
状态3:
扫描该点的上边点:
如果该点为1:
则如果该点为上一个点,转到状态3,如不是:
存储该点坐标,转到状态1。
否则转到状态4:
状态4:
扫描该点的上边点:
如果该点为1:
则如果该点为上一个点,转到状态5,如不是:
存储该点坐标,转到状态1。
否则转到状态5:
状态5:
最后一个点扫描结束。
求角度:
扫描数组里的数据:
数据采用FPGA片内RAM实现。
绘制指尖所在点
计算指尖点的世界坐标
思路如下:
由空间中某点在左右摄像头中的坐标计算出该空间点的三维世界坐标,世界坐标系与左摄像头的摄像机坐标系重合。
具体公式见程序。
三维坐标进行IMM滤波
卡尔曼滤波:
这种技术的多源于kinect,
1
1
1
2
3
4
5
1
1
2
6
7
7
4
4
5
5
1
8
8
7
4
4
5
5
9
9
1
1
1
8
10
7
11
4
12
9
13
13
11
14
15
15
13
16
11
14
14
14
15
17
17
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
4
8
9
7
4
9
13
14
14
11
16
1
1
1
2
3
4
5
1
1
2
6
4
4
4
4
5
5
1
8
8
4
4
4
5
5
9
9
1
1
1
8
4
4
4
4
9
9
13
13
4
14
14
14
13
4
4
14
14
14
14
4
4
4
1、手部边缘提取
原始图象
0
1
经7X7腐蚀pHand
以一7X7的结构元素(如图中蓝色框),如果框中有0,则红色框的像素点为0.
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
再经7X7膨胀pHandOpen
以一7X7的结构元素(如图中蓝色框),如果框中有1,则红色框的像素点为1.
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1