Commit 6a25b961 by chentian

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	serviceapi/imageapi/src/main/java/com/founder/imageapi/ImageApiApplication.java
#	serviceapi/imageapi/src/main/java/com/founder/imageapi/controller/ImageController.java
parents fa8a6cb3 4c214a77
package com.founder.commonutils.peopleEntity;
/**
* 翻译结果
* @Author yangyang
* @Date 2021/3/21
*/
public class Camera {
private String cameraId;
private String districtName;
private String areaName;
private String cameraName;
private String x;
private String y;
private String cameraType;
private String districtCode;//刑专标准的行政区划code
private String districtCodeName;//
private String areaCode;
private String areaCodeName;
public String getCameraId() {
return cameraId;
}
public void setCameraId(String cameraId) {
this.cameraId = cameraId;
}
public String getDistrictName() {
return districtName;
}
public void setDistrictName(String districtName) {
this.districtName = districtName;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
public String getCameraName() {
return cameraName;
}
public void setCameraName(String cameraName) {
this.cameraName = cameraName;
}
public String getX() {
return x;
}
public void setX(String x) {
this.x = x;
}
public String getY() {
return y;
}
public void setY(String y) {
this.y = y;
}
public String getCameraType() {
return cameraType;
}
public void setCameraType(String cameraType) {
this.cameraType = cameraType;
}
public String getDistrictCode() {
return districtCode;
}
public void setDistrictCode(String districtCode) {
this.districtCode = districtCode;
}
public String getDistrictCodeName() {
return districtCodeName;
}
public void setDistrictCodeName(String districtCodeName) {
this.districtCodeName = districtCodeName;
}
public String getAreaCode() {
return areaCode;
}
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public String getAreaCodeName() {
return areaCodeName;
}
public void setAreaCodeName(String areaCodeName) {
this.areaCodeName = areaCodeName;
}
}
package com.founder.commonutils.peopleEntity;
import java.util.List;
/**
* 人脸检索参数
* @Author yangyang
* @Date 2021/03/19
*/
public class FaceSearchParam {
private String faceSize= "20";
//节点类型 district(分局), area(派出所)
private String nodeType="district";
//分局或派出所的id
private String nodeId="3";
private List<String> cameraIds;
//排序方式 score 相似度,time 时间,camera 摄像机,calendar 日历
private String displayType;
private Integer placeTypeId= 0;
private Integer deviceTypeId= 0;
//0:重点人员库;
//1:布控抓拍人脸库;
//2:警局内非布控抓拍
//3:户籍库人员搜索;
//4:居住库人员搜索;
// 人脸库默认值 1
private Integer type = 1;
//图片来源类型 100表示图片上传 当上传多个图片时,多个100用逗号拼接
private String dataType="100";
//人脸id
private String faceId= "";
//人脸id多个时,用英文逗号拼接
private String ids= "";
private Integer mergeType= 1;
//相似度 默认0.92
private String scoreThreshold = "0.92";
//开始时间 格式 2019-12-07 00:00:00
private String starttime= "";
//结束时间 格式 2020-03-06 23:59:59
private String endtime= "";
private String dayStartTime= "00:00:00";
private String dayEndTime= "23:59:59";
private String weekDay= "0";
private String quality= "0";
//性别 性别不限 男 女
private String gender= "";
private Integer genderConfidence= 1;
//种族
private String race= "";
private Integer raceConfidence= 1;
//年龄
private String age= "";
//帽子 戴帽子 不戴帽子
private String hat= "";
// 1-低,3-中,5-高
private Integer hatConfidence= 1;
//眼镜 眼镜不限 不戴眼镜 戴普通眼镜
private String glasses= "";
private Integer glassesConfidence= 1;
//口罩
private String mask= "";
private Integer maskConfidence= 1;
private List<String> tagIds;
public String getFaceSize() {
return faceSize;
}
public void setFaceSize(String faceSize) {
this.faceSize = faceSize;
}
public String getNodeType() {
return nodeType;
}
public void setNodeType(String nodeType) {
this.nodeType = nodeType;
}
public String getNodeId() {
return nodeId;
}
public void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
public List<String> getCameraIds() {
return cameraIds;
}
public void setCameraIds(List<String> cameraIds) {
this.cameraIds = cameraIds;
}
public String getDisplayType() {
return displayType;
}
public void setDisplayType(String displayType) {
this.displayType = displayType;
}
public Integer getPlaceTypeId() {
return placeTypeId;
}
public void setPlaceTypeId(Integer placeTypeId) {
this.placeTypeId = placeTypeId;
}
public Integer getDeviceTypeId() {
return deviceTypeId;
}
public void setDeviceTypeId(Integer deviceTypeId) {
this.deviceTypeId = deviceTypeId;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getDataType() {
return dataType;
}
public void setDataType(String dataType) {
this.dataType = dataType;
}
public String getFaceId() {
return faceId;
}
public void setFaceId(String faceId) {
this.faceId = faceId;
}
public String getIds() {
return ids;
}
public void setIds(String ids) {
this.ids = ids;
}
public Integer getMergeType() {
return mergeType;
}
public void setMergeType(Integer mergeType) {
this.mergeType = mergeType;
}
public String getScoreThreshold() {
return scoreThreshold;
}
public void setScoreThreshold(String scoreThreshold) {
this.scoreThreshold = scoreThreshold;
}
public String getStarttime() {
return starttime;
}
public void setStarttime(String starttime) {
this.starttime = starttime;
}
public String getEndtime() {
return endtime;
}
public void setEndtime(String endtime) {
this.endtime = endtime;
}
public String getDayStartTime() {
return dayStartTime;
}
public void setDayStartTime(String dayStartTime) {
this.dayStartTime = dayStartTime;
}
public String getDayEndTime() {
return dayEndTime;
}
public void setDayEndTime(String dayEndTime) {
this.dayEndTime = dayEndTime;
}
public String getWeekDay() {
return weekDay;
}
public void setWeekDay(String weekDay) {
this.weekDay = weekDay;
}
public String getQuality() {
return quality;
}
public void setQuality(String quality) {
this.quality = quality;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getGenderConfidence() {
return genderConfidence;
}
public void setGenderConfidence(Integer genderConfidence) {
this.genderConfidence = genderConfidence;
}
public String getRace() {
return race;
}
public void setRace(String race) {
this.race = race;
}
public Integer getRaceConfidence() {
return raceConfidence;
}
public void setRaceConfidence(Integer raceConfidence) {
this.raceConfidence = raceConfidence;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getHat() {
return hat;
}
public void setHat(String hat) {
this.hat = hat;
}
public Integer getHatConfidence() {
return hatConfidence;
}
public void setHatConfidence(Integer hatConfidence) {
this.hatConfidence = hatConfidence;
}
public String getGlasses() {
return glasses;
}
public void setGlasses(String glasses) {
this.glasses = glasses;
}
public Integer getGlassesConfidence() {
return glassesConfidence;
}
public void setGlassesConfidence(Integer glassesConfidence) {
this.glassesConfidence = glassesConfidence;
}
public String getMask() {
return mask;
}
public void setMask(String mask) {
this.mask = mask;
}
public Integer getMaskConfidence() {
return maskConfidence;
}
public void setMaskConfidence(Integer maskConfidence) {
this.maskConfidence = maskConfidence;
}
public List<String> getTagIds() {
return tagIds;
}
public void setTagIds(List<String> tagIds) {
this.tagIds = tagIds;
}
}
package com.founder.commonutils.peopleEntity;
/**
* 人脸检索结果
* @Author yanru
* @Date 2020/4/2119:29
*/
public class FaceSearchResult {
private String id;//人脸id (faceId)
private String cameraId;//摄像头id
private String cameraName;//摄像头名称
private String file;//图片路径
private String imageUrl;//大图路径
private String time;//拍摄时间
private String score;//相似度
private String gender;//性别
private String race;//种族
private String age;//年龄段
private String hat;//帽子
private String glass;//眼镜
private String mask;//口罩
private String hair;//发型
private String address;//摄像头地址
private String x;//摄像头经度
private String y;//摄像头纬度
private String cameraType;//摄像头类型
private String districtCode;//刑专标准的行政区划code
private String districtCodeName;//
private String areaCode;
private String areaCodeName;
private String scoreThreshold;
private Integer type;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCameraId() {
return cameraId;
}
public void setCameraId(String cameraId) {
this.cameraId = cameraId;
}
public String getCameraName() {
return cameraName;
}
public void setCameraName(String cameraName) {
this.cameraName = cameraName;
}
public String getFile() {
return file;
}
public void setFile(String file) {
this.file = file;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getRace() {
return race;
}
public void setRace(String race) {
this.race = race;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getHat() {
return hat;
}
public void setHat(String hat) {
this.hat = hat;
}
public String getGlass() {
return glass;
}
public void setGlass(String glass) {
this.glass = glass;
}
public String getMask() {
return mask;
}
public void setMask(String mask) {
this.mask = mask;
}
public String getHair() {
return hair;
}
public void setHair(String hair) {
this.hair = hair;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getX() {
return x;
}
public void setX(String x) {
this.x = x;
}
public String getY() {
return y;
}
public void setY(String y) {
this.y = y;
}
public String getCameraType() {
return cameraType;
}
public void setCameraType(String cameraType) {
this.cameraType = cameraType;
}
public String getDistrictCode() {
return districtCode;
}
public void setDistrictCode(String districtCode) {
this.districtCode = districtCode;
}
public String getDistrictCodeName() {
return districtCodeName;
}
public void setDistrictCodeName(String districtCodeName) {
this.districtCodeName = districtCodeName;
}
public String getAreaCode() {
return areaCode;
}
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public String getAreaCodeName() {
return areaCodeName;
}
public void setAreaCodeName(String areaCodeName) {
this.areaCodeName = areaCodeName;
}
public String getScoreThreshold() {
return scoreThreshold;
}
public void setScoreThreshold(String scoreThreshold) {
this.scoreThreshold = scoreThreshold;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
}
package com.founder.commonutils.util;
import com.founder.commonutils.peopleEntity.FaceSearchResult;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @Author yy
* @Date 2020/4/2618:12
*/
public class DataUtil {
/**
* 时间戳转化为yyyy-MM-dd HH24:mm:ss格式的时间
* @param date
* @return
*/
public static String getDateString(Long date){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置格式
String dateStr=format.format(date);
return dateStr;
}
/**
* <T>标识这是一个泛型方法
* @param list List<T>是一个泛型类
* @param limit
* @param <T>
* @return
* @throws Exception
*/
public static <T> List pldata(List<T> list, int limit) throws Exception {
long start = System.currentTimeMillis();
int size = list.size();
long threadNum = size / limit;
int startnum = 0;
int endnum = 0;
List<List<T>> lists = new ArrayList<>();
for (int i = 0; i < threadNum + 1; i++) {
startnum = i * limit;
endnum = ((i + 1) * limit);
if (startnum > list.size()) {
break;
}
if (endnum > list.size()) {
endnum = list.size();
}
if (startnum == endnum) {
break;
}
List<T> pllist = list.subList(startnum, endnum); //从fromIndex(包含),到toIndex(不包含)
lists.add(pllist);
}
return lists;
}
/*public static List<List<CameraFaceResult>> plCameraFaceResult(List<CameraFaceResult> list, int limit) throws Exception {
long start = System.currentTimeMillis();
int size = list.size();
long threadNum = size / limit;
int startnum = 0;
int endnum = 0;
List<List<CameraFaceResult>> lists = new ArrayList<>();
for (int i = 0; i < threadNum + 1; i++) {
startnum = i * limit;
endnum = ((i + 1) * limit);
if (startnum > list.size()) {
break;
}
if (endnum > list.size()) {
endnum = list.size();
}
if (startnum == endnum) {
break;
}
List<CameraFaceResult> pllist = list.subList(startnum, endnum); //从fromIndex(包含),到toIndex(不包含)
lists.add(pllist);
}
return lists;
}
public static List<List<FaceImpactResult>> plFaceImpactResult(List<FaceImpactResult> list, int limit) throws Exception {
long start = System.currentTimeMillis();
int size = list.size();
long threadNum = size / limit;
int startnum = 0;
int endnum = 0;
List<List<FaceImpactResult>> lists = new ArrayList<>();
for (int i = 0; i < threadNum + 1; i++) {
startnum = i * limit;
endnum = ((i + 1) * limit);
if (startnum > list.size()) {
break;
}
if (endnum > list.size()) {
endnum = list.size();
}
if (startnum == endnum) {
break;
}
List<FaceImpactResult> pllist = list.subList(startnum, endnum); //从fromIndex(包含),到toIndex(不包含)
lists.add(pllist);
}
return lists;
}
public static List<List<FacePaihResult>> plFacePaihResult(List<FacePaihResult> list, int limit) throws Exception {
long start = System.currentTimeMillis();
int size = list.size();
long threadNum = size / limit;
int startnum = 0;
int endnum = 0;
List<List<FacePaihResult>> lists = new ArrayList<>();
for (int i = 0; i < threadNum + 1; i++) {
startnum = i * limit;
endnum = ((i + 1) * limit);
if (startnum > list.size()) {
break;
}
if (endnum > list.size()) {
endnum = list.size();
}
if (startnum == endnum) {
break;
}
List<FacePaihResult> pllist = list.subList(startnum, endnum); //从fromIndex(包含),到toIndex(不包含)
lists.add(pllist);
}
return lists;
}*/
// 数据回执数据计算
public static int sum(List<List<FaceSearchResult>> list) throws Exception {
final int[] sum = {0};
list.forEach( p -> {
sum[0] = sum[0] +p.size();
});
return sum[0];
}
/**
* 十进制转二进制
* @param number
* @return
*/
public static String decimalToBinary(int number){
String binary="";
try {
int r = 0; //用来存储余数
while (number != 0) {
r = number % 2;//取余
number = number / 2;//求商
binary=r+""+binary;
}
}catch (Exception e){
e.printStackTrace();
}
return binary;
}
/**
*输入多位的二进制 输出 每位二进制前几位计算成十进制的值
* @param binaryStr
* @param limit
* @return
*/
public static Map<Integer,Object> binaryToValue(String binaryStr,int limit){
Map<Integer,Object> map=new HashMap();
try {
if(null!=binaryStr&&binaryStr.length()>0){
if(binaryStr.length()<=8){//单字节
if(binaryStr.length()<limit){
limit=binaryStr.length();
}
binaryStr=binaryStr.substring(binaryStr.length()-limit,binaryStr.length());
int sum=binaryToDecimal(binaryStr);
map.put(0,sum);
}else{//多字节
String subStr="";
String subStr_sy=binaryStr;
boolean flag=true;
int index=0;
while(flag){
int endnum = subStr_sy.length();
int startnum=endnum-8;
if(startnum<=0){
startnum=0;
flag=false;
}
subStr=binaryStr.substring(startnum,endnum);//从右往左截取
if(subStr.length()<limit){
limit=subStr.length();
}
subStr=subStr.substring(subStr.length()-limit,subStr.length());
int sum=binaryToDecimal(subStr);
map.put(index,sum);
subStr_sy=binaryStr.substring(0,startnum);//截取剩余的
index++;
}
}
}
}catch (Exception e){
e.printStackTrace();
}
return map;
}
/**
* 一位的二进制转为十进制
* @param binaryStr
* @return
*/
public static int binaryToDecimal(String binaryStr){
double sumDouble=0;
int index=0;
if(null!=binaryStr&&binaryStr.length()>0){
for(int i=binaryStr.length()-1;i>=0;i--){//从右往左依次取位
String indexStr=binaryStr.charAt(i)+"";
int indexValue=Integer.parseInt(indexStr);
double pow=indexValue*Math.pow(2, index);//Math.pow(2, index)标识2的index次方
sumDouble=sumDouble+pow;//2的index次方
index++;
}
}
int sum = new Double(sumDouble).intValue();
return sum;
}
public static String getDhTime(String time){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd&HHmmss!");
try {
Date beginTimeDate = sdf.parse(time);
Calendar cal = Calendar.getInstance();
//在输入时间的基础上减8个小时
cal.setTime(beginTimeDate);
cal.add(Calendar.HOUR_OF_DAY, -8);
beginTimeDate = cal.getTime();
time = sdf2.format(beginTimeDate);
//将符号替换为大华的参数规范
time = time.replace("&","T");
time = time.replace("!","Z");
} catch (ParseException e) {
e.printStackTrace();
}
return time;
}
public static String parseDhTime(String time){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd&HHmmss!");
try {
Date beginTimeDate = sdf.parse(time);
Calendar cal = Calendar.getInstance();
cal.setTime(beginTimeDate);
beginTimeDate = cal.getTime();
time = sdf2.format(beginTimeDate);
//将符号替换为大华的参数规范
time = time.replace("&","T");
time = time.replace("!","Z");
} catch (ParseException e) {
e.printStackTrace();
}
return time;
}
public static Map getOneWeekDate(){
Map<String,String> map = new HashMap();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//拿到当前时间
Date nowDate = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(nowDate);
//往前推7天
calendar.add(Calendar.DATE, -7);
Date startDate = calendar.getTime();
map.put("startTime",String.valueOf(startDate.getTime()/1000));
map.put("endTime",String.valueOf(nowDate.getTime()/1000));
return map;
}
public static int getAge(Date birthDay){
Calendar cal = Calendar.getInstance();
if (cal.before(birthDay))
{
throw new IllegalArgumentException(
"The birthDay is before Now.It's unbelievable!");
}
int yearNow = cal.get(Calendar.YEAR);
int monthNow = cal.get(Calendar.MONTH);
int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
cal.setTime(birthDay);
int yearBirth = cal.get(Calendar.YEAR);
int monthBirth = cal.get(Calendar.MONTH);
int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
int age = yearNow - yearBirth;
if (monthNow <= monthBirth)
{
if (monthNow == monthBirth)
{
if (dayOfMonthNow < dayOfMonthBirth)
age--;
}
else
{
age--;
}
}
return age;
}
}
......@@ -11,7 +11,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.founder</groupId>
......@@ -52,7 +52,7 @@
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
......
package com.founder.imageapi;
package com.founder.ytlf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@ComponentScan(basePackages = {"com.founder"})
@EnableDiscoveryClient
public class ImageApiApplication {
@Autowired
private RestTemplateBuilder restTemplateBuilder;
public static void main(String[] args) {
SpringApplication.run(ImageApiApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){return restTemplateBuilder.build();}
}
package com.founder.imageapi.controller;
package com.founder.ytlf.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.founder.commonutils.peopleEntity.FaceSearchParam;
import com.founder.commonutils.publicEntity.MapRestResult;
import com.founder.commonutils.util.HttpClient;
import com.founder.commonutils.util.TokenUtils;
import com.founder.servicebase.logs.OperLog;
import com.founder.servicebase.logs.OperationType;
import com.founder.ytlf.service.YtlfService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* <p>
* 第三方图像接口管理
* 云天接口管理 前端控制器
* </p>
*
* @author yangyang
* @since 2021-03-18
*/
@Api(description = "第三方图像接口管理(云天)")
@Api(description = "云天接口管理")
@RestController
@RequestMapping("/imageapi")
public class ImageController {
@RequestMapping("/ytlf")
public class YtlfController {
@Value("${image_url}")
private String image_url;
@Autowired
private YtlfService ytlfService;
//获取token
//案件查询(存储reids)
@OperLog(message = "token获取",operation = OperationType.QUERY)
@ApiOperation(value = "token获取")
@PostMapping("/token")
public MapRestResult getToken() {
//获取云天励飞token
//获取token
String accessToken = TokenUtils.getYtgsToken();
return MapRestResult.build(202,"成功获取token信息",accessToken);
}
......@@ -164,5 +168,18 @@ public class ImageController {
}
return MapRestResult.build(500,"请求失败",null);
}
// 人脸动态检索接口接口
@OperLog(message = "人脸动态检索接口",operation = OperationType.QUERY)
@ApiOperation(value = "人脸动态检索接口")
@PostMapping(value = "/getFaceImageByUploadImage",consumes = "multipart/*",headers = "content-type=multipart/form-data")
public MapRestResult getFaceIdsByUploadImage(@RequestParam(value = "files",required = true) MultipartFile[] files, FaceSearchParam faceSearchParam) {
long startTime=new Date().getTime();
MapRestResult result=ytlfService.getFaceImageByUploadImage(files,faceSearchParam);
long endTime=new Date().getTime();
long timeDiffer=endTime-startTime;
System.out.println("人脸检索**请求时长**********"+timeDiffer+"毫秒");
return result;
}
}
package com.founder.ytlf.mapper;
import com.founder.commonutils.peopleEntity.Camera;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Mapper
public interface CameraInfoDao {
List<Camera> getCameraInfoByIds(@Param(value = "cameraIds") String cameraIds);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.founder.ytlf.mapper.CameraInfoDao">
<select id="getCameraInfoByIds" parameterType="java.lang.String" resultType="com.founder.commonutils.peopleEntity.Camera">
select
id as cameraId,
NAME as cameraName,
CITY as areaName,
STATION_ID as areaCode,
STATION_ID AS areaCodeName,
NAME as districtId,
NAME as areaId,
x as x,
y as y,
area_name as cameraType
from t_camera_info camera where 1=1
<if test="cameraIds!=null and cameraIds!=''">and CAMERA_CODE in ${cameraIds}</if>
</select>
</mapper>
package com.founder.ytlf.service;
import com.founder.commonutils.peopleEntity.FaceSearchParam;
import com.founder.commonutils.publicEntity.MapRestResult;
import org.springframework.web.multipart.MultipartFile;
/**
* <p>
* 云天接口 服务类
* </p>
*
* @author yangyang
* @since 2021-03-19
*/
public interface YtlfService {
MapRestResult getFaceImageByUploadImage(MultipartFile[] files, FaceSearchParam faceSearchParam);
}
package com.founder.ytlf.service.impl;
import com.founder.commonutils.peopleEntity.Camera;
import com.founder.commonutils.util.DataUtil;
import com.founder.ytlf.mapper.CameraInfoDao;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
/**
* @Author yy
* @Date 2021/03/21
*/
@Component
public class CommonService {
@Autowired
private CameraInfoDao cameraInfoDao;
public Map<String, Object> getCameraInfoByIds(String cameraId) {
Map<String, Object> returnMap = new HashMap<>();
List<Camera> cameras = cameraInfoDao.getCameraInfoByIds(cameraId);
if (cameras != null&&cameras.size()>0) {
for(Camera camera:cameras){
Map<String, String> map = new HashMap<>();
String address = camera.getAreaName() + " " + camera.getAreaCodeName()+ "" +camera.getCameraName();
String areaName = camera.getAreaName();
String x = camera.getX(),y = camera.getY();
String cameraType=camera.getCameraType();
String areaCode=camera.getAreaCode();
String areaCodeName=camera.getAreaCodeName();
map.put("address", address);//某地区 某派出所 某摄像头
map.put("x", x);
map.put("y", y);
map.put("cameraName", camera.getCameraName());// 摄像头名称
map.put("cameraType",cameraType);
map.put("districtCodeName",areaName);// 地区名称
map.put("areaCode",areaCode);// 派出所代码
map.put("areaCodeName",areaCodeName);// 派出所名称
returnMap.put(camera.getCameraId(),map);
}
}
return returnMap;
}
/**
* 配饰代码转汉字
*
* @return
*/
public Map<String, Object> accessoriesToValue(String genderStr, String raceStr, String accessoriesStr, String ageStr) {
Map<String, Object> resultMap = new HashMap<>();
Object genderValue=null;
/*gender
性别(byte0: bit0~bit3)
0表示不确定
1表示男性
2表示女性*/
if (StringUtils.isNotEmpty(genderStr)) {
int gender = Integer.parseInt(genderStr);
String genderBinary = DataUtil.decimalToBinary(gender);
Map<Integer, Object> list = DataUtil.binaryToValue(genderBinary, 4);
if (null != list && list.size() > 0) {
genderValue = list.get(0);
if (null != genderValue) {
if ("0".equals(genderValue.toString())) {
genderValue = "不确定";
} else if ("1".equals(genderValue.toString())) {
genderValue = "男性";
} else if ("2".equals(genderValue.toString())) {
genderValue = "女性";
}
}
}
}
resultMap.put("gender", genderValue);
/*Race
•民族(byte0: bit0~bit3)
0表示汉族
1表示外籍
•口罩(byte1: bit0~bit3)
0表示不确定是否戴口罩
1表示不戴口罩
2表示戴口罩*/
Object raceBinaryValue=null;
Object maskBinaryValue=null;
if (StringUtils.isNotEmpty(raceStr)) {
int race = Integer.parseInt(raceStr);
String raceBinary = DataUtil.decimalToBinary(race);
Map<Integer, Object> list = DataUtil.binaryToValue(raceBinary, 4);
if (null != list && list.size() > 0) {
raceBinaryValue = list.get(0);
if (null != raceBinaryValue) {
if ("0".equals(raceBinaryValue.toString())) {
raceBinaryValue = "汉族";
} else if ("1".equals(raceBinaryValue.toString())) {
raceBinaryValue = "外籍";
}
}
maskBinaryValue = list.get(1);
if (null != maskBinaryValue) {
if ("0".equals(maskBinaryValue.toString())) {
maskBinaryValue = "不确定";
} else if ("1".equals(maskBinaryValue.toString())) {
maskBinaryValue = "不戴口罩";
} else if ("2".equals(maskBinaryValue.toString())) {
maskBinaryValue = "戴口罩";
}
}
}
}
resultMap.put("race", raceBinaryValue);
resultMap.put("mask", maskBinaryValue);
/*Accessories
•眼镜(byte0: bit0~bit:3)
0表示不确定是否戴眼镜
1表示不戴眼镜
2表示戴(普通)眼镜
3表示戴太阳镜
•帽子(byte1: bit0~bit3)
0表示不确定是否戴帽子
1表示不戴帽子
2表示戴帽子
•发型(byte2: bit0~bit3)
0表示不确定头发长短
1表示短发
2表示长发*/
Object glassBinaryValue = null;
Object hatBinaryValue = null;
Object hairBinaryValue = null;
if (StringUtils.isNotEmpty(accessoriesStr)) {
int accessories = Integer.parseInt(accessoriesStr);
String accessoriesBinary = DataUtil.decimalToBinary(accessories);
Map<Integer, Object> list = DataUtil.binaryToValue(accessoriesBinary, 4);
if (null != list && list.size() > 0) {
glassBinaryValue = list.get(0);
hatBinaryValue = list.get(1);
hairBinaryValue = list.get(2);
if (null != glassBinaryValue) {
if ("0".equals(glassBinaryValue.toString())) {
glassBinaryValue = "不确定";
} else if ("1".equals(glassBinaryValue.toString())) {
glassBinaryValue = "不戴眼镜";
}else if ("2".equals(glassBinaryValue.toString())) {
glassBinaryValue = "戴(普通)眼镜";
}else if ("3".equals(glassBinaryValue.toString())) {
glassBinaryValue = "戴太阳镜";
}
}
if (null != hatBinaryValue) {
if ("0".equals(hatBinaryValue.toString())) {
hatBinaryValue = "不确定";
} else if ("1".equals(hatBinaryValue.toString())) {
hatBinaryValue = "不戴帽子";
}else if ("2".equals(hatBinaryValue.toString())) {
hatBinaryValue = "戴帽子";
}
}
if (null != hairBinaryValue) {
if ("0".equals(hairBinaryValue.toString())) {
hairBinaryValue = "不确定";
} else if ("1".equals(hairBinaryValue.toString())) {
hairBinaryValue = "短发";
}else if ("2".equals(hairBinaryValue.toString())) {
hairBinaryValue = "长发";
}
}
}
}
resultMap.put("glass", glassBinaryValue);
resultMap.put("hat", hatBinaryValue);
resultMap.put("hair", hairBinaryValue);
/*Age
年龄段(byte0: bit0~bit7),按照年龄段划分
实际年龄(byte1: bit0~bit7)表示实际年龄数,实际年龄并没有置信度,也没有新旧版本标志*/
Object ageBinaryValue=null;
if (StringUtils.isNotEmpty(ageStr)) {
int age = Integer.parseInt(ageStr);
String ageBinary = DataUtil.decimalToBinary(age);
Map<Integer, Object> list = DataUtil.binaryToValue(ageBinary, 7);
if (null != list && list.size() > 0) {
// Object ageGroupBinaryValue = list.get(0);//年龄段
ageBinaryValue = list.get(1);//年龄
// resultMap.put("ageGroup", ageGroupBinaryValue);
}
}
resultMap.put("age", ageBinaryValue);
return resultMap;
}
}
package com.founder.ytlf.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.founder.commonutils.peopleEntity.FaceSearchParam;
import com.founder.commonutils.peopleEntity.FaceSearchResult;
import com.founder.commonutils.publicEntity.MapRestResult;
import com.founder.commonutils.util.DataUtil;
import com.founder.commonutils.util.HttpClient;
import com.founder.commonutils.util.TokenUtils;
import com.founder.ytlf.service.YtlfService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*
*
* <p>
* 云天接口 服务实现类
* </p>
*
* @author yangyang
* @since 2021-03-03
*/
@Service
public class YtlfServiceImpl implements YtlfService {
@Value("${ImageIdsByUploadImageUrl}")
private String ImageIdsByUploadImageUrl;
@Value("${FaceIdByIdUrl}")
private String FaceIdByIdUrl;
@Value("${FaceBigByIdUrl}")
private String FaceBigByIdUrl;
@Autowired
private RestTemplate restTemplate;
@Autowired
private CommonService commonService;
/**
* 获取照片上所有人像的id以及人像图片
* @param files
* @return
*/
/**
* 根据上传的图片获取人脸检索的结果,总共分为如下四步
* 1、根据上传的图片获取图片id,云天莞视称该id为imageId,每张照片对应一个imageId
* 2、根据图片id(imageId)获取人像id(faceId),人像id可能为多个
* 3、通过人像id获取检索的照片结果
* 4、通过摄像头id获取摄像头经纬度
* 5、通过人脸id获取照片大图信息
* @return
*/
@Override
public MapRestResult getFaceImageByUploadImage(MultipartFile[] files, FaceSearchParam faceSearchParam){
MapRestResult result = null;
Map returnMap=new HashMap();
//前台传送的参数不为空,上传的照片不为空
try {
if (null != faceSearchParam && null != files && files.length > 0) {
List<Map<String,String>> faceIdList=new ArrayList<>();
for (MultipartFile file : files) {//轮询检索照片
//判断文件格式
String fileName=file.getOriginalFilename();
if(fileName.indexOf(".")!=-1){
String gs=fileName.substring(fileName.indexOf("."),fileName.length());
if(!gs.equalsIgnoreCase(".jpg")&&!gs.equalsIgnoreCase(".jpeg")&&!gs.equalsIgnoreCase(".png")&&!gs.equalsIgnoreCase(".bmp")){
result = MapRestResult.build(1001,"支持jpg,jpeg,png,bmp格式的照片",null,null);
return result;
}
}
// 调用file文件二进制上传方式接口
String imageId = getImageIdsByUploadImage(file);
// 根据人像id获取人脸id
List<Map<String,String>> faceIds = getFaceIdsByImageId(imageId);
faceIdList.addAll(faceIds);//获取到每张照片的人像id,放入集合中
}
if (null != faceIdList && faceIdList.size() > 1) {//当有多个人像id时
List<String> faceIds=new ArrayList<>();
for(Map map:faceIdList){
faceIds.add(map.get("id").toString());
}
//将list中的元素拼接为以逗号分隔的字符串,末尾不带逗号
String faceIdStr = StringUtils.join(faceIds, ",");
//faceId的个数需要与dataType的个数一一对应,所以这里也需要拼接
List<String> dataType = new ArrayList<>();
for (int i = 0; i < faceIds.size(); i++) {
dataType.add(faceSearchParam.getDataType());//图片来源类型 默认为100
}
String dataTypeStr = StringUtils.join(dataType, ",");
faceSearchParam.setIds(faceIdStr);
faceSearchParam.setDataType(dataTypeStr);
} else if (null != faceIdList && faceIdList.size() == 1) {//当图片上有只有一个人脸时
faceSearchParam.setFaceId(faceIdList.get(0).get("id"));
}
if (null != faceIdList&faceIdList.size()>0) {//获取数据并翻译
//将实体类对象转换为json字符串
List<FaceSearchResult> faceSearchResultList = getFaceSearchResultByFaceId(JSONObject.toJSONString(faceSearchParam));
//获取摄像头经纬度等信息
float number=faceSearchResultList.size()/100+1;
int flnum= (int) Math.ceil(number);
long startTime=new Date().getTime();
List<FaceSearchResult> resultList=handelCameraInfo(faceSearchResultList,flnum);
long endTime=new Date().getTime();
long timeDiffer=endTime-startTime;
System.out.println("人脸结果***翻译***时长**********"+timeDiffer+"毫秒");
returnMap.put("data",resultList);
int total=0;
if(null!=resultList&&resultList.size()>0){
total=resultList.size();
}
returnMap.put("total",total);
result = MapRestResult.build(200,"成功获取人像检索信息",null,returnMap);
}else{
result = MapRestResult.build(1001,"未检索到人像信息",null,null);
}
}else{
result = MapRestResult.build(1001,"请上传照片",null,null);
}
}catch (Exception e){
result = MapRestResult.build(500,"获取人像检索信息失败",null,null);
e.printStackTrace();
}
return result;
}
/**
* 1、根据上传的图片获取图片id
* @return
*/
public String getImageIdsByUploadImage(MultipartFile file){
String imageId=null;
try {
String token= TokenUtils.getYtgsToken();
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("multipart/form-data");
headers.set("Authorization", "Bearer "+token);
// 设置请求的格式类型
headers.setContentType(type);
MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
form.add("file",file.getResource());
HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
String resultString = restTemplate.postForEntity(ImageIdsByUploadImageUrl, files, String.class).getBody();
if (StringUtils.isNotEmpty(resultString)) {//如果返回结果不为空
JSONObject result = JSONObject.parseObject(resultString);
if (result.containsKey("data")) {
JSONObject dataObject = result.getJSONObject("data");//获取返回的数据结果
imageId = dataObject.getString("id");
}
}
}catch (Exception e){
e.printStackTrace();
}
return imageId;
}
/**
* 2、根据图片id(imageId)获取人像id(faceId) 4.2.5
* @param imageId
* @return
*/
public List<Map<String,String>> getFaceIdsByImageId(String imageId){
List<Map<String,String>> faceIds=new ArrayList<>();
String token= TokenUtils.getYtgsToken();
Map herders=new HashMap();
//设置请求的header参数
herders.put("Authorization","Bearer "+token);
String url=FaceIdByIdUrl+imageId;
String resultString=HttpClient.doGet(url,herders,null);
if(StringUtils.isNotEmpty(resultString)){//如果返回结果不为空
JSONObject result=JSONObject.parseObject(resultString);
if(result.containsKey("data")){
JSONArray jsonArray=result.getJSONArray("data");
if(null!=jsonArray&&jsonArray.size()>0){
for(Object obj:jsonArray){
JSONObject resultObject=(JSONObject)obj;
String id=resultObject.getString("id");
String faceUrl=resultObject.getString("imageData");
//如果图片不是以 http 开头的情况才会加上
if(!faceUrl.startsWith("http")){
faceUrl="http://26.3.12.56"+faceUrl;
System.out.println("image 的值是:"+faceUrl);
}
String json=resultObject.getString("json");
Map map=new HashMap();
map.put("id",id);// 小图的id
map.put("faceUrl",faceUrl);//小图url 图片地址
map.put("json",json);// 人脸库位置
faceIds.add(map);
}
}
}
}
return faceIds;
}
/**
*3、通过人像id获取检索的照片结果(动态检索)
*/
public List<FaceSearchResult> getFaceSearchResultByFaceId(String jsonObjectStr){
List<FaceSearchResult> faceSearchResults=new ArrayList<>();
String token=TokenUtils.getYtgsToken();
Map herders=new HashMap();
//设置请求的header参数
herders.put("Authorization","Bearer "+token);
herders.put("Content-Type","application/json");
//循环请求
Boolean flag=true;
int page=1;
int pageSize=5000;
int currentPageTotal=0;//当前页返回的结果总数
try {
while (flag) {
String url = "http://26.3.12.56:8083/api/intellif/share/face/search/face/page/" + page + "/pagesize/" + pageSize;
String resultString = HttpClient.doPostJson(url, herders, jsonObjectStr);
if (null != resultString) {//如果返回结果不为空
JSONObject result = JSONObject.parseObject(resultString);
if (result.containsKey("data")) {
JSONArray jsonArray = result.getJSONArray("data");//当前页返回的结果总数
if(null!=jsonArray&&jsonArray.size()>0) {
currentPageTotal = jsonArray.size();
for (Object object : jsonArray) {
FaceSearchResult faceSearchResult = new FaceSearchResult();
JSONObject jsonObject1 = (JSONObject) object;
String camera = jsonObject1.getString("camera");//摄像头id
String file = jsonObject1.getString("file");// 图片地址
//如果图片不是以 http 开头的情况才会加上
if(!file.startsWith("http")){
file="http://26.3.12.56"+file;
}
String id = jsonObject1.getString("id");//人脸id(faceId)
long time = jsonObject1.getLong("time");//时间戳格式
String score = jsonObject1.getString("score");//相似度
String gender = jsonObject1.getString("gender");//性别
String race = jsonObject1.getString("race");//种族
String accessories = jsonObject1.getString("accessories");//配饰
String age = jsonObject1.getString("age");//年龄
Map<String,Object> map=commonService.accessoriesToValue(gender, race, accessories, age);
faceSearchResult.setId(id);
faceSearchResult.setCameraId(camera);
faceSearchResult.setFile(file);
faceSearchResult.setTime(DataUtil.getDateString(time));
faceSearchResult.setScore(score);
faceSearchResult.setGender(map.get("gender")+"");
faceSearchResult.setRace(map.get("race")+"");
faceSearchResult.setAge(map.get("age")+"");
faceSearchResult.setHat(map.get("hat")+"");
faceSearchResult.setGlass(map.get("glass")+"");
faceSearchResult.setMask(map.get("mask")+"");
faceSearchResult.setHair(map.get("hair")+"");
faceSearchResults.add(faceSearchResult);
}
}
}
}
if (currentPageTotal < pageSize || currentPageTotal > pageSize) {//每页的总数大于当前页返回的总数,退出循环,d当期页的总数大于分页数,说明其接口无分页
flag = false;
} else if (currentPageTotal == pageSize) {//当前页等于总页数,则循环请求
++page;
}
}
}catch (Exception e){
e.printStackTrace();
}
return faceSearchResults;
}
public List<FaceSearchResult> handelCameraInfo(List<FaceSearchResult> list, int limit) throws Exception{
long start = System.currentTimeMillis();
//数据批量分流
List<List<FaceSearchResult>> pllist= DataUtil.pldata(list,limit);
ExecutorService executorService = Executors.newCachedThreadPool();//按需分配线程池
//翻译成功list
List<FaceSearchResult> sucesslist = new ArrayList<>();
//由于数据为空
final int[] errors = {0};
// 全流式处理转换成CompletableFuture[]
CompletableFuture[] cfs = pllist.stream()
.map(carKkInfos -> CompletableFuture.supplyAsync(() -> getCamerainfoAndImageuri(carKkInfos),executorService)
.handle((t, throwable) ->{
if(throwable!=null){
System.out.println("翻译数据失败=============="+throwable);
return t;
}else{
System.out.println("翻译数据成功=============="+t.toString());
sucesslist.addAll(t);
return t;
}
} )
).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(cfs).join();
// System.out.println("翻译入库成功===================="+sucesslist.size());
System.out.println("耗时="+(System.currentTimeMillis()-start));
//排除为空的数据,数据翻译完有为空的数据,待核查 // TODO: 2020/7/14
if(null!=sucesslist&&sucesslist.size()>0){
Iterator<FaceSearchResult> it = sucesslist.iterator();
while(it.hasNext()){
FaceSearchResult faceSearchResult = it.next();
if (null == faceSearchResult || (null != faceSearchResult && org.springframework.util.StringUtils.isEmpty(faceSearchResult.getId()))) {
it.remove();
}
}
}
return sucesslist;
}
/**
* 得到转换以图搜图结果的摄像头信息和大图id
* @param faceSearchResults
* @return
*/
public List<FaceSearchResult> getCamerainfoAndImageuri(List<FaceSearchResult> faceSearchResults){
//翻译入库成功list
List<FaceSearchResult> sucesslist = new ArrayList<>();
faceSearchResults.forEach(p ->{
try{
String imageUri= getImageByFaceId(p.getId());
Map<String,Object> map= commonService.getCameraInfoByIds(p.getCameraId());
p.setImageUrl(imageUri);// 大图url
p.setAddress((String) map.get("address"));
p.setX((String)map.get("x"));
p.setY((String)map.get("y"));
p.setCameraName((String)map.get("cameraName"));
p.setCameraType((String)map.get("cameraType"));
p.setDistrictCode((String)map.get("districtCode"));
p.setDistrictCodeName((String)map.get("districtCodeName"));
p.setAreaCode((String)map.get("areaCode"));
p.setAreaCodeName((String)map.get("areaCodeName"));
sucesslist.add(p);
}catch (Exception e){
e.printStackTrace();
System.out.println("请求失败===================="+p);
}
});
return sucesslist;
}
// 4.2.4 根据小图获取大图,返回人脸小图在大图中的位置
public String getImageByFaceId(String faceId) {
String uri=null;
String token = TokenUtils.getYtgsToken();
Map herders = new HashMap();
//设置请求的header参数
herders.put("Authorization", "Bearer " + token);
String url = FaceBigByIdUrl + faceId;
String resultString = HttpClient.doGet(url, herders, null);
if (StringUtils.isNotEmpty(resultString)) {
JSONObject result = JSONObject.parseObject(resultString);
if (result.containsKey("data")) {
JSONObject dataObject = result.getJSONObject("data");//获取返回的数据结果
if(null!=dataObject){
uri=dataObject.getString("uri");
if(StringUtils.isNotEmpty(uri)&&!uri.contains("26.3.12.56")){
uri="http://26.3.12.56"+dataObject.getString("uri");
}
}
}
}
return uri;
}
}
......@@ -13,3 +13,14 @@ spring.cloud.nacos.config.namespace=052aa986-5c18-4013-a91a-583dc01aaf8b
#spring.cloud.nacos.config.ext-config[0].data-id=eduport.properties
# 开启动态刷新配置,否则配置文件修改,工程无法感知
#spring.cloud.nacos.config.ext-config[0].refresh=true
#############################云天接口访问地址开始#############################################
#4.4.1 图片文件传输方式地址 true-进行人脸检测 false-不进行人脸检测 0-检索上传 1-布控上传 2-红名单上传
ImageIdsByUploadImageUrl = http://26.3.12.56:8083/api/intellif/image/upload/true?type=0
#根据大图 id 获取所有小图信息,这里的 id 来自上传图片接口返回的 id
FaceIdByIdUrl = http://26.3.12.56:8083/api/intellif/face/image/
#4.2.4 根据小图获取大图,返回人脸小图在大图中的位置
FaceBigByIdUrl=http://26.3.12.56:8083/api/intellif/image/face/json/
#############################云天接口访问地址结束##############################################
\ No newline at end of file
......@@ -77,6 +77,7 @@
<dependency>
<groupId>org.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>10</version>
</dependency>
<!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 -->
<dependency>
......@@ -150,5 +151,9 @@
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment