liuxiaolong
2019-05-06 c15226e1b58f255dbebf1bdca8d4e53b9277249c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.basic.analy.utils;
import com.basic.analy.service.FaceSdkTool;
import lombok.Data;
import org.apache.log4j.Logger;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.RecursiveTask;
@Data
public class SearchImgThreadUtil extends RecursiveTask<Integer> {
    private static final int THRESHOLD = 200;
    private List<Map> faceArray;
    private byte[] imageData;
    private int likePer;
    private int start;
    private int end;
    public static List<Map> resultList = new ArrayList<>();
    private Logger logger = Logger.getLogger(EsThreadUtils.class);
 
    public SearchImgThreadUtil(byte[] imageData,List<Map> faceArray,int likePer,int start,int end){
        this.imageData = imageData;
        this.faceArray =faceArray;
        this.likePer = likePer;
        this.start = start;
        this.end = end;
    }
    public Integer compute(){
 
        boolean canCompute = faceArray.size() <= THRESHOLD;
        if (canCompute){
            logger.info("进入likePer:"+likePer);
            for (int i = 0,item = faceArray.size(); i <item; i++){
 
                if((byte[])faceArray.get(i).get("feature")!=null&&!"".equals((byte[])faceArray.get(i).get("feature"))){
                    // 业务处理
                    Float num= new FaceSdkTool().compareFeature(imageData, (byte[])faceArray.get(i).get("feature"));
                    if(Math.round(num*100)<likePer){ // 相似度小于阈值数据丢弃
                        continue;
                    }
                    logger.info("相似值为"+likePer);
                    faceArray.get(i).put("likePer",Math.round(num*100));
                    resultList.add(faceArray.get(i));
                }
            }
        }else {
            int middle = (end + start) / 2;
            SearchImgThreadUtil subtask1 = new SearchImgThreadUtil(imageData,faceArray.subList(start, end),likePer,start, middle);
            SearchImgThreadUtil subtask2 = new SearchImgThreadUtil(imageData,faceArray.subList(start, end),likePer,middle, end);
            invokeAll(subtask1, subtask2);
            subtask1.join();
            subtask2.join();
        }
        return faceArray.size();
    }
//    public static void main(String[] args) {
//
//    }
//
//    public byte[] getImageData() {
//        return imageData;
//    }
//
//    public void setImageData(byte[] imageData) {
//        this.imageData = imageData;
//    }
//
//    public int getLikePer() {
//        return likePer;
//    }
//    public void setLikePer(int likePer) {
//        this.likePer = likePer;
//    }
//
//    public List<Map> getFaceArray() {
//        return faceArray;
//    }
//    public void setFaceArray(List<Map> faceArray) {
//        this.faceArray = faceArray;
//    }
//    public static List<Map<String, Object>> getCurrentList() {
//        return currentList;
//    }
//    public static void setCurrentList(List<Map<String, Object>> currentList) {
//        SearchImgThreadUtil.currentList = currentList;
//    }
}