基于传统方法的行人重识别系统开发案例

465 阅读3分钟

 

话回正题,记录一下基于传统方法的小规模行人重识别系统的开发案例。整个案例在Linux系统中搭建,利用QT开发框架,图像模块使用opencv,数据库采用MySQL。

案例处理通过海康威视监控摄像头获得的三段行人视频,数据集真难采集,多亏周围师兄弟姐妹帮助,一并感谢了!!!在已有视频基础上,分三个部分实现整个功能,分别是行人图像提取,后端数据处理,前端重识别检索。 下面分别介绍,本着Talk is nothing,show me the codes的思想,三个部分的代码都挂了出来。

一.行人图像提取

从视频中提取行人图片,用检测和跟踪,可以将行人提取出来,但为了后期的处理方便,我就笨人多干活,全手动采集照片吧。但一张张通过截屏工具提取,实在难为小的了,我做了一个类似于视频播放器的小应用。在这个窗口中点击左上方顶点,会在旁边窗口出现截取的图片,根据是否满足要求确认是否保存图片。

行人提取

保留的图片命名方式为CameraID_SuquenceID,通过这两个字段便可以定位视频,以及行人在视频中的位置。这里设置的行人图片大小为128X64,这个尺寸可以辨别出行人,并且在广角摄像头中这个尺寸的截取大致可以将行人的头部和腿部都包含进去。

opencv中图像的数据格式为Mat,在这里的label中显示需要经历Mat -> QImage -> QPixmap的格式转换。也可以通过opencv提供的haarcascades来检测人脸,根据获得的检测框的大小以及坐标信息,再编程扩展到整个身体。这部分的代码地址为:github.com/t20134297/s…

二.后端数据处理

这部分的程序比较多,但用一句话形容就是:将比对结果放到数据库中。后期行人检索时,只要获得视频ID和行人在该图片中的序列数,就可以就近搜索。

先说行人相似度比对方法,利用的颜色特征。将行人分为躯干和腿部两个部分,每个部分又细分为5个部分,将RGB转为HSV进行比对。opencv的直方图提取实在是用着不顺手,只能自己根据需求编一个定制化的直方图统计函数,也不知道比对的对不对,就又写了一个生成直方图的函数。

直方图

相似度比较使用Bhattacharyy distance,每一个行人都和其他行人进行比对,提取出top5,在小范围内rank1为0.833,rank5接近0.95,基本上不会出现漏检的状况。

数据库中存储的结构如图所示

mysql

每一条记录包含9个字段,top1-5为和该图片最相似的五张图片,后面的几个字段用来后期搜索定位。这部分代码地址为:github.com/t20134297/i…

三.前端重识别检索

这个部分用来检测行人,在这个应用中可以选定某个行人进行重识别应用,应用界面如图所示

reID

当选定某个待检测的行人后,程序就会到后端的数据库中定位该待检测图片的位置,并将与之最相似的图片提取出来,再通过图片ID确定视频和序列,获得视频片段。我设置了十个播放窗口,但由于重复性的原因,会根据实际检测结果进行显示。

该部分代码地址为:github.com/t20134297/i…