news 2026/9/4 1:01:08

物联网浏览器(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/3 16:34:12

思岚Aurora基础使用之数据可视化篇

思岚Aurora基础使用之数据可视化篇在我们能够从雷达得到数据之后&#xff0c;我们就可以用openCV对其进行可视化&#xff0c;方便我们观察数据的趋势。所以本篇文章介绍如何进行可视化这一操作。数据的可视化&#xff0c;其实就是在一块画布上显示出一些数据信息&#xff0c;所…

作者头像 李华
网站建设 2026/9/3 16:50:36

代码复杂度的代价远比你想象得大

引言&#xff1a;复杂度的代价远比你想象得大在 Java 后端系统演进过程中&#xff0c;代码复杂度是影响可维护性、稳定性和迭代效率的核心因素。然而&#xff0c;复杂度往往被忽视&#xff0c;直到一次“小改动”引发线上事故&#xff0c;才被重新审视。本文以“复杂度战争”为…

作者头像 李华
网站建设 2026/9/3 1:30:24

Open Interface:三分钟实现电脑全自动驾驶的终极指南

Open Interface&#xff1a;三分钟实现电脑全自动驾驶的终极指南 【免费下载链接】Open-Interface Control Any Computer Using LLMs 项目地址: https://gitcode.com/gh_mirrors/op/Open-Interface 还在为重复性电脑操作烦恼吗&#xff1f;想让AI助手帮你完成所有繁琐任…

作者头像 李华
网站建设 2026/9/4 2:17:31

PDFKit跨平台字体兼容性终极解决方案:完整指南

PDFKit跨平台字体兼容性终极解决方案&#xff1a;完整指南 【免费下载链接】pdfkit 项目地址: https://gitcode.com/gh_mirrors/pdf/pdfkit PDFKit作为Node.js生态中功能强大的PDF生成库&#xff0c;在实际跨平台部署中常常面临字体兼容性挑战。本文将提供一套完整的解…

作者头像 李华
网站建设 2026/9/3 3:51:19

三相维也纳整流器仿真手记

三相维也纳整流器的仿真模型。控制算法采用电压和电流双闭环控制。外部电压环路为PI控制器&#xff0c;内部电流环路为bang bang滞后控制器。 网侧单位功率因数运行&#xff0c;电网电流谐波非常小。最近在实验室折腾维也纳整流器的仿真模型&#xff0c;这拓扑结构确实有点意思…

作者头像 李华