liuxiaolong
2019-07-25 c630094a48c8aad04e0af60d6b1e8c817fa926bf
compareByPhoto
3个文件已修改
169 ■■■■ 已修改文件
config/dev.yaml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/fileController.go 110 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
discovery/server.go 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/dev.yaml
@@ -7,7 +7,7 @@
    networkAdapter: enp59s0f1
compare:
    url:
     - 192.168.1.66:40010
     - 192.168.1.123:40010
weedfs:
    ip: 192.168.1.203
    uploadport: 6333
controllers/fileController.go
@@ -149,35 +149,74 @@
    }
}
type CompareResult struct {
    Id string `json:"id"`
    CameraId string `json:"cameraId"`
    CameraAddr string `json:"cameraAddr"`
    PicDate string `json:"picDate"`
    Content string `json:"content"`
    IsAlarm int `json:"isAlarm"`
    PicMaxUrl string `json:"picMaxUrl"`
    PicSmUrl []string `json:"picSmUrl"`
    Sex string `json:"sex"`
    AgeDescription string `json:"ageDescription"`
    Race string `json:"race"`
    TaskName string `json:"taskName"`
    BaseInfo []DbPersonVo `json:"baseInfo"`
    VideoUrl string `json:"videoUrl"`
}
type DbPersonVo struct {
    BwType string `json:"bwType"`
    CompareScore float32 `json:"compareScore"`
    IdCard string `json:"idCard"`
    MonitorLevel string `json:"monitorLevel"`
    PersonId string `json:"personId"`
    PersonName string `json:"personName"`
    PersonPicUrl string `json:"personPicUrl"`
    PhoneNum string `json:"phoneNum"`
    Sex string `json:"sex"`
    TableId string `json:"tableId"`
    TableName string `json:"tableName"`
}
var captureTable = "capturetable" // 抓拍库
type SearchCondition struct {
    Url string `json:"url"`
    TableIds []string `json:"tableIds"`
    CompThreshold string `json:"compThreshold"`
}
// @Summary 以图搜图
// @Description  以图搜图
// @Accept json
// @Produce json
// @Tags 以图搜图
// @Param url formData string true "url"
// @Param tableId formData string true "底库id"
// @Param compThreshold formData string true "比对阈值"
// @Param condition body controllers.SearchCondition true "搜索参数"
// @Success 200 {string} json "{"code":200, msg:"", data:"", success:true}"
// @Failure 500 {string} json "{"code":500, msg:"", data:"", success:false}"
// @Router /data/api-v/dbperson/searchByPhoto [POST]
func (controller FileController) SearchByPhoto(c *gin.Context) {
    photoUrl := c.Request.FormValue("url")
    tableId := c.Request.FormValue("tableId")//底库id
    compThresholdStr := c.Request.FormValue("compThreshold")//比对阈值
    compThreshold, err := strconv.ParseFloat(compThresholdStr,32)
    if photoUrl == "" || err != nil {
    var condition SearchCondition
    err := c.BindJSON(&condition)
    if err !=nil || condition.Url == "" {
        util.ResponseFormat(c, code.RequestParamError, "参数有误")
        return
    }
    if face,ok := faceExtractedMap[photoUrl];!ok{
    compThreshold, err := strconv.ParseFloat(condition.CompThreshold,32)
    if condition.Url == "" || err != nil {
        util.ResponseFormat(c, code.RequestParamError, "参数有误")
        return
    }
    if face,ok := faceExtractedMap[condition.Url];!ok{
        util.ResponseFormat(c, code.RequestParamError, "参数有误")
        return
    } else {
        arg := protomsg.CompareArgs{
            TableIds:[]string{ captureTable },
            FaceFeature:face.FaceBytes,
            CompareThreshold:float32(compThreshold),
        }
        if tableId !=""{
            arg.TableIds = []string{ tableId }
        if condition.TableIds !=nil {
            arg.TableIds = append(arg.TableIds, condition.TableIds...)
        }
        b, err := proto.Marshal(&arg)
        if err !=nil{
@@ -186,7 +225,7 @@
        }
        compServerList := config.CompServerInfo.Url
        fmt.Println("compServerList:", compServerList)
        resultList :=make([]protomsg.Dbperson,0)
        resultList :=make([]CompareResult,0)
        for _,str :=range compServerList{
            reqUrl := "tcp://"+str
            reqClient := deliver.NewClient(deliver.ReqRep, reqUrl)
@@ -198,21 +237,52 @@
            if err !=nil{
                continue
            }
            m :=make(map[string]float32,0)
            err = json.Unmarshal(resultB, &m)
            rList :=make([]protomsg.Esinfo,0)
            err = json.Unmarshal(resultB, &rList)
            if err !=nil{
                continue
            }
            personIds := make([]string,len(m))
            for k,_ :=range m{
                personIds = append(personIds,k)
            var dbPersonM map[string]*protomsg.Esinfo
            var captureM map[string]*protomsg.Esinfo
            var personIds []string
            var captureIds []string
            for _,v :=range rList{
                if v.Tableid == captureTable {
                    captureM[v.Id] = &v
                    personIds = append(personIds,v.Id)
                } else {
                    dbPersonM[v.Id] = &v
                    captureIds = append(captureIds,v.Id)
                }
            }
            esServerIp := config.EsInfo.Masterip
            esServerPort := config.EsInfo.Httpport
            index := config.EsInfo.EsIndex.Dbtablepersons.IndexName
            dbpeople, e := esApi.Dbpersoninfosbyid(personIds, index, esServerIp, esServerPort)
            if e ==nil{
                resultList = append(resultList,dbpeople...)
            dbpersons, e := esApi.Dbpersoninfosbyid(personIds, index, esServerIp, esServerPort)
            if e ==nil && dbpersons !=nil {
                for _,p :=range dbpersons {
                    var dbP = DbPersonVo {
                        PersonId: p.Id,
                        IdCard: p.IdCard,
                        CompareScore: dbPersonM[p.Id].CompareScore,
                        MonitorLevel: p.MonitorLevel,
                        PersonName: p.PersonName,
                        PersonPicUrl: p.PersonPicUrl,
                        PhoneNum: p.PhoneNum,
                        Sex: p.Sex,
                        TableId: p.TableId,
                    }
                    dbTableInfos, _ := esApi.Dbtablefosbyid([]string{p.TableId}, config.EsInfo.EsIndex.DbTables.IndexName, esServerIp, esServerPort)
                    if dbTableInfos !=nil{
                        dbP.BwType = dbTableInfos[0].BwType
                        dbP.TableName = dbTableInfos[0].TableName
                    }
                    var cr = CompareResult{
                        BaseInfo:[]DbPersonVo{ dbP },
                    }
                    resultList = append(resultList,cr)
                }
            }
        }
        util.ResponseFormat(c,code.Success,resultList)
discovery/server.go
@@ -1 +1,58 @@
package discovery
import (
    "basic.com/pubsub/protomsg.git"
    "basic.com/valib/gopherdiscovery.git"
    "fmt"
    "time"
    "webserver/extend/logger"
    "github.com/gogo/protobuf/proto"
)
const (
    Discovery_Server = "tcp://0.0.0.0:40008"
    Discovery_UrlPubSub = "tcp://0.0.0.0:50008"
)
//启动discovery的server
var discoveryServer *gopherdiscovery.DiscoveryServer
var dbChangeChan chan *protomsg.DbChangeMessage
func StartServer() {
    var clients []string
    var err error
    var (
        defaultOpts = gopherdiscovery.Options{
            SurveyTime:   3 * time.Second,
            //RecvDeadline: 3 * time.Second,
            PollTime:     5 * time.Second,
        }
    )
    discoveryServer, err = gopherdiscovery.Server(Discovery_Server, Discovery_UrlPubSub, defaultOpts)
    logger.Debug("server: ", discoveryServer)
    logger.Debug("err:",err)
    logger.Debug("clients: ",clients)
    dbChangeChan = make(chan *protomsg.DbChangeMessage)
    for {
        select {
        case dbMsg := <-dbChangeChan:
            publishMessage(dbMsg)
        }
    }
}
//广播数据库改变的msg
func publishMessage(msg *protomsg.DbChangeMessage) {
    sendBytes,err := proto.Marshal(msg)
    if err ==nil{
        discoveryServer.PublishMsg(string(sendBytes))
    }
}
func AddDbMessage(msg *protomsg.DbChangeMessage) {
    fmt.Println("MSG In")
    dbChangeChan<-msg
}