手势识别(肤色检测)重心计算以及重心变化趋势计算

        本文的基于CortexM3手势识别采用肤色检测加重心计算的方法,可以用于识别简单动态手势(向左、向右、向上、向下等),最终效果如下所示:

        (某些原因就不展示了QAQ)

        作者第一次尝试将xilinx的hls工具生成的verilog代码用在altera的板子上,虽然从最后综合结果来看,资源优化没有自家做的好,但勉强可以实现功能。

        整个工程很多是网上资源缝合的,以下着重介绍自己设计的重心计算以及其变化趋势的计算方法(注意:图像二值化部分省略了)。

一、重心计算

        二值化后图像的重心计算采用以下公式(公式是网上找的):

xdata=\frac{\sum xf(x,y)}{\sum f(x,y)}

ydata = \frac{\sum yf(x,y)}{\sum f(x,y)}

        其中x、y代表每个像素的横纵坐标,f代表像素此处的像素值。乍一眼看上去这个公式设计加法比较多,而且加法的位宽也不小,不利于硬件实现,但在二值化的图像下,该公式可以化简很多,化简之后公式为(纵坐标类似):

xdata = \frac{\sum x}{\sum whitepixel}

        其中分子只剩下坐标的相加,分母其实代表图中白色像素块的个数,此时公式就比较利于硬件实现,而且利用分母的计算,我们可以进行一些肤色检测的抗干扰设计,例如白色像素少于一定阈值则不计算重心或者忽略边界白色像素点等,比较简单,这里就不展开介绍了。

        以下给出我在HLS工具中的重心计算代码(写的十分不规范):

	for(int i=0;i<IMG_H; i++){
		for(int j=0;j<IMG_W;j++){
#pragma HLS PIPELINE
			data_buffer=in.read();
			data_buffer_out_vga=data_buffer;
			if(i<=up && i>=down && j<=right && j>=left){
				if(data_buffer[0]!=0){
					x_up_data=x_up_data+j;
					x_down_data=x_down_data+1;
					y_up_data=y_up_data+i;
				}
				temp=(data_buffer_out_vga==0)?0:4095;
				out.write(temp);
			}else{
				out.write(2184);
			}
		}
	}
	white_num=x_down_data;
	if(x_down_data>white_threshold){
		thres_ok=1;
		if(x_down_data!=0){
			x_data=x_up_data/x_down_data;
			y_data=y_up_data/x_down_data;
		}
	}else{
		thres_ok=0;
	}

        以下给出利用相同原理在python中实现的效果图,其中最后一张标出了重心位置(同时包括色彩空间转化、形态学运算等操作)。

 二、重心趋势计算

        网上有很多动态手势识别的方法,但由于作者比较懒,所以自创了一种实现起来十分容易的趋势计算方法,而且包含多种阈值调节,可以控制识别动态手势的快慢和幅度等,最终实现下来效果也凑活。

        该部分完全是在keil中进行编程,也就是交给cm3核来做了,一大段的c代码,以下给出了一部分:

 

        代码的主体思想就是定义一个类似于FIFO的存储器,每隔十帧图像,会将一个重心数据存入存储器2中,同时存储器0使用存储器1的数据进行覆盖,存储器1使用存储器2的内容进行覆盖,这样就可以做到实时检测,而不用固定采集一定数量帧图像之后再进行检测。

        此处代码给出的是右移的判断,首先存储器2的值要大于存储器0的值,同时,各个存储器的变化幅度也要满足一定阈值,防止手势突然移动等误检测。检测成功之后将所有存储器赋值当前最新的重心坐标即可,整体思路还是挺简单的。

        好了,本文到此就结束了,写这篇文章的主要目的还是记录一下几个星期以来的成果,大佬勿喷。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值