今天把以前用C++写的步态能量图算法改成用Python写的,以前做实验使用的是中科院的CASIA DatasetB,因为这个数据库里面的步态序列图并没有归一化,而且还存在寸黑色的图片,所以处理起来需要判断的情况比较多。但是在 OULP-C1V2_Pack数据库中,图片都是归一化好的,统一为128*88,所以处理起来比较轻松。Python里面提供了opencv的接口,所以实现起来比较方便
下面是代码讲解:仅以Gallery_set为例
第一部分:获取Gallery_Set所定义的详细范围
#获取OULP-C1V2_SubjectIDList(FormatVersion1.0)/IDList_OULP-C1V2-A-All_Gallery下的Gallery Set所定义的每个人的其实步态剪影的序列范围
idList=[] # id的列表与star和end一一对应
start=[] # 起始帧数
end=[] # 结束帧数
def ReadInformation(path='E:\OULP-C1V2_Pack\OULP-C1V2_SubjectIDList(FormatVersion1.0)/IDList_OULP-C1V2-A-85_Gallery.csv', encoding='utf-8'):
csv_reader = csv.reader(open(path))
for row in csv_reader:
idList.append(row[0])
start.append(row[2])
end.append(row[3])
ReadInformation()
print(idList) # 调试用
print(start) # 调试用
print(end) # 调试用
第二部分:定义用于步态能量图合成的类
# 用于存储步态能量图的类
class GenerateGEI(object):
"""
"""
def __init__(self,imagefolder):
self.gei_name = imagefolder[:-7]+imagefolder[-7:]+".png"
self.num=0
self.gei=np.zeros((128, 88), dtype="uint8")
def __del__(self):
del self.gei_name
def InsertImage(self,image):
self.num=self.num+1
show_gei = self.CalGei(image)
cv2.imwrite(self.gei_name, show_gei)
return 1 # 要加self.
def CalGei(self,image):
sp=image.shape
if self.num==1:
self.gei=image.copy() # copy 函数不会影响原图
else:
for i in range(sp[0]):
p_old_gei=self.gei[i]
p=image[i]
for j in range(sp[1]):
p_old_gei[j]=(p_old_gei[j]*(self.num-1)+p[j])/self.num
return self.gei
第三部分:用于步态能量图合成的主程序
def load_data(path="E:/OULP-C1V2_Pack/OULP-C1V2_NormalizedSilhouette(88x128)/Seq00"):
num = len(idList)
for index, idx in enumerate(idList): # 对所有人的文件夹进行遍历
print(idx + "," + start[index] + "," + end[index])
imagefolder=path+"/"+idx
print(imagefolder)
generate = GenerateGEI(imagefolder)
for k in range(int(start[index]),int(end[index])+1): # 个人文件夹下面的图片依据相应的列表
pathimage = '0' * (8 - len(str(k))) + str(k)+".png"
imagepath=imagefolder+"/"+pathimage #gei 图的存储位置就是文件夹+每个人的id.png
img = cv2.imread(imagepath,0)
print(imagepath)
print(type(img))
generate.InsertImage(img)
# 按照csv配置文件读取相应的帧数,进行步态能量图的合成
del generate # 这里要释放内存,然后循环进行下一个人的步态能量图的合成
第四部分:测试程序
ReadInformation()
load_data()
大功告成!!整个程序大概跑了两个多小时。Probe_Set跑完也花了差不多两个多小时。
很开心,今天又有一个人发现了我的小缺点,这样我就有了改正错误的动力啦。关电脑!回去睡觉喽。明天! 你好!