news 2026/10/13 9:27:56

物联网浏览器(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/10/11 22:20:36

AWS-Nuke 终极指南:快速清理AWS账户的完整解决方案

AWS-Nuke 终极指南&#xff1a;快速清理AWS账户的完整解决方案 【免费下载链接】aws-nuke Remove all the resources from an AWS account 项目地址: https://gitcode.com/gh_mirrors/aws/aws-nuke AWS-Nuke 是一款强大的开源工具&#xff0c;专门用于彻底清理AWS账户中…

作者头像 李华
网站建设 2026/10/12 6:46:09

利用XPlaneConnect从X-Plane内读写数据

开发步骤&#xff08;C/C&#xff09;在https://github.com/nasa/XPlaneConnect 下载XPlaneConnect插件和源代码。将XPlaneConnect.zip插件解压并复制到X-Plane安装目录下的/Resources/plugins/目录&#xff0c;然后打开X-Plane。创建一个C/C工程&#xff0c;将XPlaneConnect-1…

作者头像 李华
网站建设 2026/10/12 6:46:21

计算统计指标

SHADE和SaDE跑CEC2017测试集对比图&#xff0c;并分别连续运行30次并且输出最优值&#xff0c;最差值&#xff0c;平均值&#xff0c;标准差 基于成功历史的参数自适应差分进化算法(SHADE)是经典的差分进化变体&#xff0c;该论文发表于2013年&#xff0c;性能非常有参考价值&a…

作者头像 李华
网站建设 2026/10/13 8:05:17

自编基于层结构(Layer)的添加自注意力机制

自编基于层结构&#xff08;Layer&#xff09;的添加自注意力机制直接开撕&#xff01;传统神经网络层结构那套全连接激活函数的组合拳早就看腻了&#xff0c;今天咱们整点刺激的——给网络层装个自注意力插件。这玩意儿能让网络自己决定哪些信息重要&#xff0c;比无脑全连接不…

作者头像 李华
网站建设 2026/10/12 21:48:45

【大数据高并发核心场景实战】 数据持久化层 - 查询分离

1. 业务场景适用场景&#xff1a;数据查询缓慢&#xff08;数据量大导致、数据聚合时调用外部系统过多导致等&#xff09;写数据效率尚可所有数据都可能修改&#xff08;若存在冷数据&#xff0c;可使用上一章的冷热分离方案&#xff09;基本思路&#xff1a;将更新的数据放在主…

作者头像 李华