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.准备工作: 内网:单击事件按钮— ...
随机推荐
- windows下隐藏磁盘分区(转)
在一定情况下有的人会想隐藏掉部分分区,比如双系统的情况 有两种方式 方法1: 删除盘符,适合在双系统的情况下隐藏掉另外一个系统相关的分区 请注意是删除盘符 不是删除分区 此电脑右键管理 点击磁盘管理 ...
- MVC+Ninject+三层架构+代码生成 -- 总结(一、數據庫)
一.數據表 是參照 別人的庫建表的 ,主鍵都是用int 自增,若是跨數據庫的話,建議使用GUID為主鍵.
- 更新.net core 3.0,dotnet ef命令无法使用的解决办法
之前项目采用.net core 2.2 实现,今天更新vs2019,系统.net core也被升级到3.0,在cmd中使用dotnet ef命令出现 “无法执行,因为找不到指定的命令或文件.可能的原因 ...
- DevExpress之GridControl控件小知识
DevExpress之GridControl控件小知识 一.当代码中的DataTable中有建数据关系时,DevExpress 的 GridControl 会自动增加一个子视图 .列名也就是子表的字段 ...
- Windows 搭建 nginx rtmp服务器
1.环境开发环境:windows开发工具:ffmpeg.nginx.nginx-rmtp-module.vlc media player播放器 2.准备文件官方ffmpeg下载地址:http://ww ...
- 5.Javascript闭包得实现原理和作用
闭包的实现原理和作用 1.闭包的概念:指有权访问另一个函数作用域中的变量的函数,一般情况就是在一个函数中包含另一个函数. 2.闭包的作用:访问函数内部变量.保持函数在环境中一直存在,不会被垃圾回收机制 ...
- VUE组件3 数据流和.sync修饰符
单向数据流:数据通过prop从父组件传递到子组件中,当父级组件中的数据更新时,传子组件也会更新,但不能在子组件中修改.防止子组件在无意中修改,改变父级组件状态 然而,双向数据绑定在某些情况下有用.如果 ...
- Java JDBC 操作二进制数据、日期时间
二进制数据 mysql提供了四种类型来存储二进制数据: TinyBlob 最多可存储255字节 Blob 最多可存储65KB MediumBlob 最多可存储16MB LongBlob ...
- Python 集合(Set)、字典(Dictionary)
集合(Set) 集合是无序的,无序也就没有索引,不能进行索引相关的操作.无序,python解释器就不能通过索引(位置)区分集合中的相同元素,所以集合中不能有相同的元素. 集合用大括号{ }表示. 集 ...
- java InputStream的使用
package cn.kongxh.io3;import java.io.File ;import java.io.InputStream ;import java.io.FileInputStrea ...