步态识别领域有相当多的研究是基于 “类能量图”。一个步态周期内的所有轮廓按照某种规则累计构成的模板统称为 “类能量图”。能量图法不易受到轮廓噪声的干扰,有效地融合空间的信息,但是特征维数较高。下表展示了 “类能量图” 的主要类型[1]。本博客用 Python 实现步态能量图。
文章图片
1 思路 首先我们通过图像分割算法可以获得一个步态内人的二值轮廓图像,如下所示:
文章图片
然后我们需要将人从图片中剪切出来,获得一副较小的图片,然后按照步态能量图中的计算公式将一个步态内的图像叠加在一起后除以图片数目。
2 实现
2.1 图像剪裁 代码:
def cut_img(img, T_H, T_W):
# 获得最高点和最低点
y = img.sum(axis=1)
y_top = (y != 0).argmax(axis=0)
y_btm = (y != 0).cumsum(axis=0).argmax(axis=0)
img = img[y_top:y_btm + 1, :]
# 如果高比宽要大,用高计算 resize 的比例
_r = img.shape[1] / img.shape[0]
_t_w = int(T_H * _r)
img = cv2.resize(img, (_t_w, T_H), interpolation=cv2.INTER_CUBIC)
# 获得人的对称轴
sum_point = img.sum()
sum_column = img.sum(axis=0).cumsum()
x_center = -1
for i in range(sum_column.size):
if sum_column[i] > sum_point / 2:
x_center = i
break
h_T_W = int(T_W / 2)
left = x_center - h_T_W
right = x_center + h_T_W
if left <= 0 or right >= img.shape[1]:
left += h_T_W
right += h_T_W
_ = np.zeros((img.shape[0], h_T_W))
img = np.concatenate([_, img, _], axis=1)
img = img[:, left:right]
return img.astype('uint8')
测试:
# 图片读取为二值格式
img = cv2.imread('H:/gait recognition/data/001-bg-01-090-044.png',-1)
img1 = cut_img(img, 128, 128)cv2.imshow('image', img)
cv2.imshow('image1', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果显示:
文章图片
2.2 能量图制作 分割后的一个步态周期内的图像:
文章图片
代码:
def get_GEI(path):
# path 是文件夹对应的路径,一个文件夹下面放置一个步态周期内的已经剪裁好的图像
imgs = os.listdir()
path1 = os.getcwd()
imgs_list = [cv2.imread(path1 +'\\'+i)/255 for i in imgs]GEI = imgs_list[0]
for i in imgs_list[1:]:
GEI += i
GEI = GEI/len(imgs_list)return GEI
测试:
GEI = get_GEI(r'H:\gait recognition\data\gait')cv2.imshow('image2', GEI)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果显示:
文章图片
注意:
一定要对图像做归一化处理,否则将显示下面的结果:
【Python 实现步态能量图】
文章图片
参考资料:
[1] 贲晛烨, 徐森, and 王科俊. "行人步态的特征表达及识别综述." 模式识别与人工智能 2012 年 01 (2012): 71-81.
推荐阅读
- MATLAB图形界面|基于Matlab的汽车出入库计时计费系统
- 召回率 Recall、精确度Precision、准确率Accuracy
- 模板匹配(Match Template) 修改版
- 模式识别|马尔科夫原理及应用场景
- 模式识别相似性测度距离计算---几种距离对比
- (3) windows下可运行的mat转xml,VOC-release4.01 DPM训练的model(mat)转为OpenCV latentsvm可以加载的model(xml)