package controller
|
|
import (
|
"encoding/base64"
|
"gat1400Exchange/config"
|
"gat1400Exchange/pkg"
|
"gat1400Exchange/service"
|
"net/http"
|
"time"
|
|
"gat1400Exchange/pkg/logger"
|
"gat1400Exchange/repository"
|
"gat1400Exchange/vo"
|
|
"github.com/gin-gonic/gin"
|
)
|
|
type CaptureController struct {
|
Repository repository.CaptureRepository
|
}
|
|
// 构造函数
|
func NewCaptureController() CaptureController {
|
svr := repository.NewCaptureRepository()
|
controller := CaptureController{Repository: svr}
|
|
return controller
|
}
|
|
// 批量提交人脸
|
func (a CaptureController) Faces(c *gin.Context) {
|
var req vo.RequestFaceList
|
if err := c.BindJSON(&req); err != nil {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
if len(req.FaceListObject.FaceObject) == 0 {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
face := req.FaceListObject.FaceObject[0]
|
logger.Debug("Receive new message, Id:%s Ip:%s faceId:%s, LeftTopX:%d, appearTime:%s", c.RemoteIP(), face.DeviceID, face.FaceID, face.LeftTopX, face.FaceAppearTime)
|
|
// 如果开启了下级, 身份应该是消息代理, 不再转发到服务器
|
if config.ClientConf.Enable && config.ServeConf.Role == "agent" {
|
go a.Repository.VIIDMsgForward(&req)
|
} else if config.ServeConf.Role == "cascade" {
|
go service.AddFaceNotification(&face)
|
}
|
|
if config.ForwardConf.SyncServer != "" {
|
go a.Repository.FaceForward(req.FaceListObject.FaceObject)
|
}
|
|
rspMsg := vo.ResponseStatus{
|
RequestURL: c.FullPath(),
|
StatusCode: vo.StatusSuccess,
|
StatusString: vo.StatusString[vo.StatusSuccess],
|
Id: face.FaceID,
|
LocalTime: time.Now().Format("20060102150405"),
|
}
|
|
c.JSON(http.StatusOK, gin.H{"ResponseStatusObject": rspMsg})
|
}
|
|
func (a CaptureController) VideoLabels(c *gin.Context) {
|
var req vo.RequestVideoLabelList
|
if err := c.BindJSON(&req); err != nil {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
if len(req.VideoLabelListObject.VideoLabelObject) == 0 {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
videoLabel := req.VideoLabelListObject.VideoLabelObject[0]
|
logger.Debug("Receive new message, Id:%s Ip:%s ", videoLabel.VideoLabelID, c.RemoteIP())
|
|
// 转人脸消息
|
var face vo.FaceObject
|
face.FaceID = videoLabel.VideoLabelID
|
face.InfoKind = 1
|
face.SourceID = videoLabel.VideoImageID
|
face.DeviceID = videoLabel.IVADeviceID
|
face.LocationMarkTime = videoLabel.CreateTimeAbs
|
face.FaceAppearTime = videoLabel.BehaviorAnalysisObject.BehaviorBeginTime
|
face.FaceDisAppearTime = videoLabel.BehaviorAnalysisObject.BehaviorEndTime
|
|
var hasTargetImage bool
|
var bgImageWith, bgImageHeight int
|
var bgImage *vo.SubImageInfoObject
|
for idx, img := range videoLabel.SubImageList.SubImageInfoObject {
|
videoLabel.SubImageList.SubImageInfoObject[idx].EventSort = 10
|
|
// 判断是否有小图, 如果没有切一张
|
if img.Type == "14" {
|
bgImageWith, bgImageHeight = img.Width, img.Height
|
} else {
|
hasTargetImage = true
|
bgImage = &videoLabel.SubImageList.SubImageInfoObject[idx]
|
}
|
|
face.SubImageList.SubImageInfoObject = append(
|
face.SubImageList.SubImageInfoObject,
|
videoLabel.SubImageList.SubImageInfoObject[idx],
|
)
|
}
|
|
if !hasTargetImage && bgImage != nil {
|
imgData, err := base64.StdEncoding.DecodeString(bgImage.Data)
|
if err != nil {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
var subRect pkg.Rect
|
subRect.Left = bgImageWith / 3
|
subRect.Top = bgImageHeight / 3
|
subRect.Right = subRect.Left * 2
|
subRect.Bottom = subRect.Top * 2
|
|
subImage, err := pkg.SubCutImage(imgData, &subRect, 0)
|
if err != nil {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
var subImageInfo = vo.SubImageInfoObject{
|
ImageID: bgImage.ImageID + "1",
|
EventSort: 10,
|
DeviceID: bgImage.DeviceID,
|
StoragePath: "",
|
Type: "11",
|
FileFormat: "Jpeg",
|
ShotTime: bgImage.ShotTime,
|
Width: subRect.Right - subRect.Left,
|
Height: subRect.Top - subRect.Bottom,
|
Data: base64.StdEncoding.EncodeToString(subImage),
|
}
|
face.SubImageList.SubImageInfoObject = append(
|
face.SubImageList.SubImageInfoObject,
|
subImageInfo,
|
)
|
}
|
|
// 如果开启了下级, 身份应该是消息代理, 不再转发到服务器
|
if config.ClientConf.Enable && config.ServeConf.Role == "agent" {
|
var faceObjList vo.RequestFaceList
|
faceObjList.FaceListObject.FaceObject = append(faceObjList.FaceListObject.FaceObject, face)
|
go a.Repository.VIIDMsgForward(&faceObjList)
|
} else if config.ServeConf.Role == "cascade" {
|
go service.AddFaceNotification(&face)
|
}
|
|
if config.ForwardConf.SyncServer != "" {
|
go a.Repository.FaceForward([]vo.FaceObject{face})
|
}
|
|
rspMsg := vo.ResponseStatus{
|
RequestURL: c.FullPath(),
|
StatusCode: vo.StatusSuccess,
|
StatusString: vo.StatusString[vo.StatusSuccess],
|
Id: videoLabel.VideoLabelID,
|
LocalTime: time.Now().Format("20060102150405"),
|
}
|
|
c.JSON(http.StatusOK, gin.H{"ResponseStatusObject": rspMsg})
|
}
|