news 2026/9/16 7:52:14

物联网浏览器(IoTBrowser)-人脸快速搜索

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
物联网浏览器(IoTBrowser)-人脸快速搜索

最近遇到一个人脸搜索的需求,驿站的快递被人误领,拿走几天还没有送回来,所以想从出库仪中找历史出库记录的想法。

实现思路:

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.多文件夹快速搜索,搜索一张还是全部

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 14:58:29

DeepSeek-R1-Distill-Qwen-7B集群部署终极指南:轻松搞定AI推理服务

想要快速上手高性能AI模型部署&#xff1f;DeepSeek-R1-Distill-Qwen-7B作为基于Qwen2.5-Math-7B蒸馏的推理模型&#xff0c;在数学、代码和逻辑任务中表现卓越。本文手把手教你构建稳定可靠的集群管理方案&#xff0c;让AI推理服务部署变得简单高效。 【免费下载链接】DeepSee…

作者头像 李华
网站建设 2026/9/16 18:24:35

风储调频在Matlab/Simulink中的探索:基于四机两区系统的实践

matlab/simulink 风储调频&#xff0c;风电调频&#xff0c;一次调频&#xff0c;四机两区系统&#xff0c;采用频域模型法使得风电渗透率25%&#xff0c;附加虚拟惯性控制&#xff0c;储能附加下垂控制&#xff0c;参与系统一次调频&#xff0c;系统频率特性优。 有SOC特性 特…

作者头像 李华
网站建设 2026/9/16 14:09:58

基于Java Swing的猜数字小游戏(2)

1、演示视频 基于Java Swing的猜数字小游戏2、项目截图 三、设计说明 3.1 整体架构设计 项目采用单一类封装所有功能&#xff08;GuessNumberGame&#xff09;&#xff0c;继承自Swing的JFrame类&#xff0c;遵循“界面与逻辑结合”的设计模式&#xff08;适合小型桌面应用&a…

作者头像 李华
网站建设 2026/9/15 18:13:55

提升 Web 端 JavaScript 的可信度:WAICT 体系详解

当前互联网时代&#xff0c;网页是最强大的应用平台。只要在浏览器中拥有合适的 API&#xff0c;你理论上可以安全运行任何你想运行的东西。不过——除了“加密学”这块。事实上&#xff0c;自 2011 年以来&#xff0c;“网页中的 JavaScript 加密”一说就被认为是“不靠谱”的…

作者头像 李华
网站建设 2026/9/16 17:34:49

一次 React 项目 lock 文件冲突修复:从 Hook 报错到 Vite 配置优化

在日常开发中&#xff0c;分支合并是高频操作&#xff0c;但稍有不慎就可能引发依赖相关的“连锁反应”。本文记录了一次rebase main后因 lock 文件冲突&#xff0c;导致 React Hook 报错的完整排查与解决过程&#xff0c;希望能为遇到类似问题的开发者提供参考。一、背景&…

作者头像 李华