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.准备工作: 内网:单击事件按钮— ...
随机推荐
- Docker 下的Zookeeper以及.ne core 的分布式锁
单节点 1.拉取镜像:docker pull zookeeper 2.运行容器 a.我的容器同一放在/root/docker下面,然后创建相应的目录和文件, mkdir zookeeper cd zo ...
- 「NOI2018」冒泡排序
「NOI2018」冒泡排序 考虑冒泡排序中一个位置上的数向左移动的步数 \(Lstep\) 为左边比它大的数的个数,向右移动的步数 \(Rstep\) 为右边比它大的数的个数,如果 \(Lstep,R ...
- 『树上匹配 树形dp』
树上匹配 Description 懒惰的温温今天上班也在偷懒.盯着窗外发呆的温温发现,透过窗户正巧能看到一棵 n 个节点的树.一棵 n 个节点的树包含 n-1 条边,且 n 个节点是联通的.树上两点之 ...
- Java学习:线程间通信
线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同重点:有效的利用资源 分析:需要那些类 1 资源类:包子类 设置包子的属性 包子的状态:有true 没有false 2 ...
- Java学习:static 关键字概述
static 关键字概述 一旦用了static关键字,那么这样的内容不再属于对象自己.而是属于类的,所以凡是本类的对象,都共享同一份. 如果没有static关键字,那么必须首先创建对象,然后通过对象才 ...
- 什么是k8s
•Kubernetes介绍 1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建,到处运行 - 容器的快速轻量 - 完整的生态环境 2.什么是 ...
- Smack Extensions用户手册
Smack Extensions用户手册 XMPP协议包括基本协议和许多可选扩展,通常记录为“XEP”.Smack为核心XMPP协议提供了org.jivesoftware.smack包,为许多协议扩展 ...
- vue 实现滚动到页面底部开始加载更多
直接上代码: <template> <div class="newsList"> <div v-for="(items, index) in ...
- 【Git】.DS_Store 是什么文件
一.为啥会注意到该文件 合并代码的时候,.DS_Store文件发生了冲突,然后进入到项目目录去看,果然存在该文件,就比较好奇该文件是干什么的. 二..DS_Store 是什么文件 .DS_Store( ...
- sudo apt update报错
在Ubuntu系统下,使用sudo apt-get update有时会出现“W: 无法下载 http://cn.archive.ubuntu.com/ubuntu/.... 校验和不符”, xj@xj ...