windows下百度离线人脸识别本地部署与使用(nodejs做客户端,c++做服务端,socket做通信)
1.离线人脸识别本地部署
详情请阅读百度人脸识别官网
2.nodejs做socket通信的客户端
为什么不直接通过调用c++编译的exe获得人脸识别结果?
原因:exe运行时会加载很多模型而消耗很多时间,导致不能实时得到人脸识别结果;而用socket通信则只需执行一次加载模型的过程,后面的请求只需直接进行人脸识别检测而只用100多毫秒得到结果。
1)nodejs将canvas得到的视频帧的base64字符串转换成图片
var image = query.image;
var base64Data = image.replace(/^data:image\/\w+;base64,/, "");
var dataBuffer = new Buffer(base64Data, 'base64');
fs.writeFile("image.png", dataBuffer, function(err) {
if(err){
console.log("保存成功!");
}else{
console.log("保存成功!");
}
});
2)创建socket(同步模式,即得到人脸识别结果再执行下面的代码)
var result = '';
var net = require('net');
var port = 8588;
var host = '127.0.0.1';
//等待检测结果出来
result = await new Promise(
function (resolve, reject) {
//创建socket客户端
var client= new net.Socket();
client.setEncoding('binary');
//连接到服务端
client.connect(port,host,function(){
//向服务端发送数据
client.write('D:\\wamp\\wamp64\\www\\eggs\\image.png');
});
client.on('data',function(data){
console.log('from server:'+ data);
console.log(data);
result = data;
//得到服务端返回来的数据
resolve({"cod"e: 1, "data": result, "msg": 'success' })
});
client.on('error',function(error){
//错误出现之后关闭连接
console.log('error:'+error);
reject({"code": 0, "data": "", "msg": error });
// client.destory();
});
client.on('close',function(){
//正常关闭连接
resolve({"code": 1, "data": "", "msg": 'socket closed' });
console.log('Connection closed');
});
}
)
return result; //result = {"code":1 , "data":xxx, "msg": xxx};
3.c++ 做socket服务端
int main(){
//std::cout << "in main" << std::endl;
//api实例指针
BaiduFaceApi *api = new BaiduFaceApi();
//初始化sdk
// 若采用证件照模式,请把id_card设为true,否则为false,证件照模式和非证件照模式提取的人脸特征值不同,
// 不能混用
bool id_card = false;
bool is_authed = true;
int suc = api->sdk_init(id_card);
if (suc != )
{
std::cout << " err{authed is failed} "<< std::endl;
getchar();
is_authed = false;
//return 0;
}
std::time_t time_begin = get_timestamp();
/*std::cout << "start tracking" << std::endl;
for (int i = 0; i < argc; i++)
{
std::cout << "argv is" << i << argv[i] << "end print " << std::endl;
}*/
WSACleanup();
//初始化WSA
WORD sockVersion = MAKEWORD(, );
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != )
{
return ;
}
//创建套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (slisten == INVALID_SOCKET)
{
printf("socket error !");
return ;
}
//绑定IP和端口
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons();
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (::bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("bind error !");
}
//开始监听
if (listen(slisten, ) == SOCKET_ERROR)
{
printf("listen error !");
return ;
}
//循环接收数据
SOCKET sClient;
sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr);
char revData[* ];
//不断监听接口获取客户端参数
while (true)
{
printf("等待连接...\n");
sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
if (sClient == INVALID_SOCKET)
{
printf("accept error !");
continue;
}
printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
//接收数据
long long int ret = recv(sClient, revData, *, );
const char * sendData = "";
//如果没接收到数据
if (ret > )
{
//如果百度人脸识别验证证书不通过
if (!is_authed)
{
sendData = "error:authed is failed";
}
else
{
revData[ret] = 0x00;
printf(revData);
//检测图片
string res = test_face_attr(api, revData);
if (res == "")
{
sendData = "error:no people";
}
else
{
bool is_utf8 = is_str_utf8(res.c_str());
std::cout << "\nis_utf8-" << is_utf8 << "\n" << std::endl;
std::cout << res << endl;
printf(res.c_str());
//发送数据
char arr[];
int len = res.copy(arr, );
arr[len] = '\0';
sendData = arr;
}
}
}
else
{
//发送数据
sendData = "{error:'no data recv'}\n";
}
send(sClient, sendData, strlen(sendData), );
std::time_t time_end = get_timestamp();
//std::cout << "tracking_result is:" << res << std::endl;
std::cout << "time cost is :" << time_end - time_begin << "ms" << std::endl;
closesocket(sClient);
}
}
windows下百度离线人脸识别本地部署与使用(nodejs做客户端,c++做服务端,socket做通信)的更多相关文章
- 百度离线人脸识别sdk的使用
1.1下载sdk运行 百度离线人脸识别sdk的使用 1.2配置环境 添加至项目,可以拖动复制或者以类库形式添加face-resource此文件夹 放到根目录上一层 激活文件与所有dll引用放到根目录嫌 ...
- 基于百度AI人脸识别技术的Demo
编写demo之前首先浏览官方API:http://ai.baidu.com/docs#/Face-API/top 下面是源码: package com.examsafety.test; import ...
- windows下使用远程工具登录虚拟机上的Linux、访问虚拟机上的服务 、端口转发、win7 telnet登陆虚拟机
首先要清楚virtual box如何设置端口转发: 一篇文章: 如何使用VirtualBox进行端口转发 由于默认的方式是用NAT来做虚拟机网络的,因此如果从外网想访问虚拟机的应用会比较麻烦.以前一直 ...
- CAS (8) —— Mac下配置CAS到JBoss EAP 6.4(6.x)的Standalone模式(服务端)
CAS (8) -- Mac下配置CAS到JBoss EAP 6.4(6.x)的Standalone模式(服务端) jboss版本: jboss-eap-6.4-CVE-2015-7501 jdk版本 ...
- Linux下更改oracle客户端字符集和服务端字符集
from:http://blog.csdn.net/chid/article/details/6166506 Linux 下更改 oracle 客户端字符集和服务端字符集 1.Linux 下更改 or ...
- windows版 Java调用人脸识别离线sdk
最近因工作需求在java-web服务中调用人脸识别离线sdk,主要通过JNA及JNI技术,但均未调试通过,JNA调用时出现以下异常,一直未解决,求大佬指点,导常信息如下: in BaiduFaceAp ...
- Java离线人脸识别SDK 支持arcface 2.0 最新版
虹软人脸识别SDK之Java版,支持SDK 1.1+,以及当前最新版本2.0,滴滴,抓紧上车! JDK SDK Win release license status 前言 由于业务需求,最近跟人脸识别 ...
- C#版免费离线人脸识别——虹软ArcSoft V3.0
[温馨提示] 本文共678字(不含代码),8张图.预计阅读时间需要6分钟. 1. 前言 人脸识别&比对发展到今天,已经是一个非常成熟的技术了,而且应用在生活的方方面面,比如手机.车站.天网等. ...
- 百度AI人脸识别的学习总结
本文主要分以下几个模块进行总结分析 项目要求:运用百度AI(人脸识别)通过本地与外网之间的信息交互(MQService),从而通过刷脸实现登陆.签字.会议签到等: 1.准备工作: 内网:单击事件按钮— ...
随机推荐
- - instanceof 和 isInstance 强转 类型 class MD
目录 目录 instanceof 和 isInstance 强转 类型 class MD 简介 测试案例 继承关系 测试代码 打印结果 Markdown版本笔记 我的GitHub首页 我的博客 我的微 ...
- 封装:WPF绘制曲线视图
原文:封装:WPF绘制曲线视图 一.目的:绘制简单轻量级的曲线视图 二.实现: 1.动画加载曲线 2.点击图例显示隐藏对应曲线 3.绘制标准基准线 4.绘制蒙板显示标准区域 曲线图示例: 心电图示例: ...
- 用Java访问带有Kerberos认证的HBase
程序代码实例如下: package com.hbasedemo; import java.io.IOException; import org.apache.hadoop.conf.Config ...
- 动画重定向技术分析及其在Unity中的应用
前言 笔者新的手游项目使用Unity引擎,动画部分要使用重定向技术来实现动画复用.笔者之前在大公司工作的时候对这块了解比较深入,读过Havok引擎在这部分的实现源码,并基于自己的理解,在公司自研的手游 ...
- APS.NET MVC + EF (05)---控制器
Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的交互,并且负责协调Model与View之间数据传递,是ASP.NET MVC框架核心.Controller为ASP. ...
- HeRaNO's NOIP CSP Round Day 2 T1 building
考试的时候居然睡着了... T1的60分做法很明显,3^n枚举每个状态并进行验证 (考试剩十分钟结束的时候我开始打,,不到五分钟就写完了? 暴力(60分) #include<bits/stdc+ ...
- EXT.NET Combox下拉Grid
<ext:ComboBox ID="cmbCategory" runat="server" TypeAhead="true" Forc ...
- 2019-07-31 Jquery
Jquery是什么? jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“ ...
- javaScript 一些小技巧
日历 创建过去七天的数组,如果将代码中的减号换成加号,你将得到未来7天的数组集合 // 创建过去七天的数组 [...Array(7).keys()].map(days => new Date(D ...
- Node初识
初识Nodejs Node.js的诞生 作者Ryan Dahl 瑞恩·达尔 2004 纽约 读数学博士 2006 退学到智利 转向开发 2009.5对外宣布node项目,年底js大会发表演讲 2010 ...