随着人脸识别技术的成熟,“刷脸”逐渐成为新时期生物识别技术应用的主要领域,为了迎合和满足现代化的市场需求,EasyCVR的人脸识别也在不断优化中,目前可通过对视频监控场景中的人、车、物等进行AI检测与抓拍识别。
在EasyCVR人脸识别中,如果识别区出现人脸即可直接识别,如果下一帧没有人脸,那么EasyCVR播放器屏幕则会显示人脸识别框,如下:
但是这个框在没有识别内容的时候出现其实是不合理的,因此我们需要把这个框去掉,且设置为只有人脸时才会出现框,没有人脸则不显示框。
在使用EasyStreamClient拉RTSP流,先初始化解码器,在获取到的I帧解码成yuv(下图操作)
下图是人脸识别和特征提取:
下图是特征提取,把特征提取到的X轴、Y轴、宽度和高度都保存在Rect的变量中。把Rect里面的值转换为SEI帧,传给前端用于绘制人脸的红色的框。
分析代码,里面有个人脸识别“int(ret.size)>0”,所以只有检测到人脸才回传给前端绘制,如果没有人脸就传递空数据给前端,才会导致只有绘制框没有取消框的操作。
此处我们需要在程序“int(ret.size)>0”加一个else操作,把一帧每有识别到的人脸给取消,再给前端,这样播放器的框会消失。
代码语言:javascript复制else {
if client.Flag {
client.Flag = false
s := PacketSei{}
s.Rect = make([]RectSei, int(ret.size))
s.Rect = append(s.Rect, RectSei{
X: 0,
Y: 0,
W: 0,
H: 0,
})
extJson, _ := json.Marshal(s)
base64Str := base64.StdEncoding.EncodeToString(extJson)
//FIXME:debug code
base64Str = string(extJson)
GenSei(uintptr(unsafe.Pointer(&result.sei[0])), &result.seiLen, base64Str)
v := cvrdo.Face{
AiBase: cvrdo.AiBase{
ID: 0,
Name: "",
ParentID: int(client.ChannelId),
CreateTime: time.Now(),
UpdateTime: time.Now(),
},
}
v.AiBase.Name = ""
v.Timestamp = 0
v.ConfidenceLevel = 0
result.face = append(result.face, v)
}
}