最近遇到一个人脸搜索的需求,驿站的快递被人误领,拿走几天还没有送回来,所以想从出库仪中找历史出库记录的想法。
实现思路:
1.从雷现出库仪上拷贝文件下来。(拷贝几十万张人脸数据花了不少时间)
2.开发人脸搜索工具
3.搜索比对(如果能找到历史数据,就能找到人)
这里主要是开发人脸搜索工具,需要实现识别图片里面是否包含人脸、人脸匹配检测等功能,网速找了一款工具,但是需要改造3点:
1.支持并发搜索,充分利用多核CPU,从几十万张图片中快速检索到想要找的人。
2.支持参数配置,支持指定图片和查找目录、搜索第一张还是全部、找到后是否打开等参数。
3.开发UI配置界面,由于工具是控制台应用,使用起来不方便,所以需要一个UI界面。
屏幕录制 2025-10-30 102642
使用IoTBrowser做为UI前端,使用少量的代码既可实现。
屏幕录制 2025-10-30 103845
核心代码:
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<div id="vue_root" class="fun_bd" style="padding:10px;">
<form class="am-form">
<fieldset>
<div class="am-form-group">
<label for="doc-ipt-email-1" class="am-u-sm-1">原始文件</label>
<div class="am-u-sm-3">
<input type="text" v-model="config.ImagePath" style="width: 75%;display: inline;" />
<input type="button" @click="selectFile()" value="选择" />
</div>
<label for="doc-ipt-email-1" class="am-u-sm-1">查找目录</label>
<div class="am-u-sm-3">
<input type="text" v-model="config.FindDir" style="width: 75%;display: inline;" />
<input type="button" value="选择" @click="selectSaveDir()" />
</div>
<label for="doc-ipt-email-1" class="am-u-sm-1">历史文件</label>
<div class="am-u-sm-3">
<input type="text" v-model="config.HistoryFileName" style="width: 75%;display: inline;" />
</div>
</div>
<div class="am-form-group">
<div class="am-u-sm-3">
<input id="ClearHistory" type="checkbox" v-model="config.ClearHistory" />
<label for="ClearHistory" class="">清理历史数据</label>
</div>
<div class="am-u-sm-3">
<input id="FindFirstStop" type="checkbox" v-model="config.FindFirstStop" />
<label for="FindFirstStop" class="">找到第一张停止</label>
</div>
<div class="am-u-sm-3">
<input id="FindOpen" type="checkbox" v-model="config.FindOpen" />
<label for="FindOpen" class="">找到后立即打开</label>
</div>
<div class="am-u-sm-3">
<!--<button onclick="startFace()" class="am-btn-primary" type="button">打开连接</button>-->
<button @click="find()" v-if="!isFind" class="am-btn-primary" type="button">开始查询</button>
<button @click="stop()" v-if="isFind" class="am-btn-primary" type="button">停止服务</button>
</div>
</div>
<div class="am-form-group">
<textarea id="txtInfo" rows="40">{{msg}}</textarea>
</div>
</fieldset>
</form>
</div>
<script>
var hostid;// 主机id
function startFace() {
dds.iot.com.open({
type: 'FaceCom',//人脸识别插件
port: 1,
baudRate: 1,
onReceive: function (res) {
if ($vue.isFind) {
if (res.data.indexOf('已找到:') == 0) {
alert(res.data)
}
addMsg(res.data)
}
//console.log('host', res.data)
},
onOpen: function (ar) {
if (ar.Success) {
hostid = ar.Data;
addMsg('连接成功!')
} else {
alert(ar.Message)
}
}
})
}
var $msg;
function addMsg(msg) {
var m = $vue.msg + "\n" + msg;
if ($vue.msg.length > 10000) {
$vue.msg = (msg);
} else {
$vue.msg = (m);
}
}
// 窗口初始化事件(操作窗口大小、标题)
$(document).bind('dds.window.init', function (e, win) {
$msg = $('#txtInfo')
startFace();
initVue();
})
var $vue;
function initVue() {
$vue = new Vue({
el: '#vue_root',
data: {
advanceSetting: false,
msg: "",
isFind:false,
config: {
ImagePath: "",
FindDir: "D:\\image",
HistoryFileName: "",
ClearHistory: true,
FindOpen: true,
FindFirstStop: true,
},
},
mounted() {
if (localStorage._faceConfig) {
this.config=JSON.parse(localStorage._faceConfig);
}
},
methods: {
selectFile() {
this.config.ImagePath = _host.selectFile();
},
find() {
var config = this.config
if (!config.ImagePath) {
alert('请选择原始文件')
return;
}
this.msg = ''
if (!config.FindDir) {
alert('请选择查找目录')
return;
}
this.isFind = true;
dds.iot.com.exeCommand({ id: hostid, name: "Find", data: { timeout1: 30000, config } }, function (ar) {
if (ar.Success) {
} else {
addMsg('操作失败:' + ar.Message)
}
})
localStorage._faceConfig = JSON.stringify(config);
},
stop() {
this.isFind = false;
dds.iot.com.exeCommand({ id: hostid, name: "Stop", data: { } }, function (ar) {
if (ar.Success) {
} else {
addMsg('操作失败:' + ar.Message)
}
})
},
clearLog() {
this.msg=''
},selectSaveDir() {
var dir = dds.file.openFolderDialog();
this.config.FindDir=(dir)
}
}
})
}
</script>
系统支持:
1.人脸数量检测、人脸匹配、人脸定位
2.多文件夹快速搜索,搜索一张还是全部