作者:xiaobin | 来源:互联网 | 2024-11-29 20:23
最近完成了一个基于步态的行为识别(ReID)的小型项目,旨在帮助老师解决特定场景下的身份识别问题。该项目的核心在于通过分析个体行走时的步态特征来区分不同的人。以下是项目的部分成果展示:
在本项目中,我们提取了几类关键特征用于识别,包括但不限于通用步态图像(GEI)系列特征以及基于光流场的特征。这些特征的结合使用显著提高了识别的准确性。具体来说,GEI系列特征能够捕捉个体行走的整体形态,而光流场特征则有助于分析运动模式的变化。右侧展示的是根据上述特征识别出的对象列表,由于排除了视角变化、服装差异等因素的影响,识别效果较为理想,首位即为正确匹配的对象。
为了实现这一功能,我们预先处理并存储了每个个体的行走序列图,以便于快速比对和识别。下面是一段简化的代码示例,展示了如何从视频流中读取帧并进行初步处理:
int main(int argc, char* argv[]) {
string video_name = argv[1];
VideoCapture video(video_name);
vector frames;
Mat frame, window_video;
int frame_num = 0;
while (true) {
if (!video.read(frame)) break;
frame_num++;
if (!frame.empty()) {
frame.copyTo(window_video);
Mat tmp;
frame.copyTo(tmp);
frames.push_back(tmp);
}
if (frame_num > 40) {
for (int ci = 0; ci Rect rect(ci * feature_width, video_height, feature_width, feature_height);
Mat feature = getFeature(frames, rect);
imshow("Gait", feature);
}
waitKey(50);
}
}
return 0;
}
除了上述代码外,还有两个重要的函数:process() 和 readFeatures()。前者负责计算识别排序,后者用于加载预先提取的特征数据和对应的行走序列图。为了提高效率,我们还实现了获取前K个最小值的功能,具体实现如下:
void getKMinScores(vector& scores, vector& k_scores, int KNN_K) {
for (int k = 0; k k_scores[k] = FLT_MAX;
}
int people_size = scores.size();
for (int pi = 0; pi int change_id = -1;
for (int kk = 0; kk if (scores[pi] change_id = kk;
}
}
if (change_id >= 0) {
if (change_id == (KNN_K - 1) || (change_id <(KNN_K - 1) && scores[pi] != k_scores[change_id + 1])) {
for (int c = 0; c k_scores[c] = k_scores[c + 1];
}
k_scores[change_id] = scores[pi];
}
}
}
}
以上就是本次项目的简单介绍。希望对从事相关领域研究的朋友们有所帮助。
(转载须注明出处:http://blog.csdn.net/xiaowei_cqu,未经许可不得用于商业目的)