一、前言

大概几年前搞过一套嵌入式linux上的人脸识别程序,当然人脸识别的核心算法并不是自己开发的,关于人脸识别算法这一块,虽然有众多的开源库可以用,甚至还可以用opencv搞算法训练深度学习之类的,个人认为始终达不到准确度的要求,尤其是人脸比对的准确度,这个需要专业的人脸训练模型才行。目前市面上绝大部分的人脸识别库提供的都是X86的或者安卓ios的库,并没有嵌入式linux的库,估计一方面因为嵌入式linux跑的板子性能比较低,还有一个就是依赖特定编译器,版本众多难以提供,市场也小,所以大部分的厂家都没有提供嵌入式linux的开发包,这个就比较鸡肋,所以很多终端厂家最终弃用linux而选用安卓作为载体系统,这样就可以用上高大上的人脸识别库了,比如萤火虫开发板,RK3288 RK3399等。

记得当时还特意搞了一整套的非常详细的通信协议,产品也初步成型,大概的设备有人脸识别终端、双目门禁、人工访客机、自助访客机、人脸比对服务器等,也试运行了一些小区,效果还行,不过在抗逆光和晚上的情况下效果不是很好,当然这是所有人脸识别设备的通病,必须依赖补光或者调整安装位置增加抗逆光摄像机来处理,这样一来对施工就有要求了增加了复杂度,设备成本也上来了,对于小终端厂商来说,这个要选择一个平衡点才行,只有用户愿意付出对应的成本才提供对应的版本。

通信方式及端口:

  • 客户端和服务端等设备统一提供web访问修改配置,端口6660。
  • 人工访客机客户端与人工访客机服务端通信采用TCP短连接,通信端口6661。
  • 自助访客机客户端与自助访客机服务端通信采用TCP长连接,通信端口6661。
  • 人脸识别比对数据库服务器采用TCP长连接,通信端口6662。
  • 服务端与数据库服务器通信采用TCP长连接,通信端口6666。
  • 数据库服务器下发人脸通行证数据采用TCP短连接,通信端口6667。
  • 电脑PC端下发配置到双目门禁采用TCP短连接,通信端口6668。
  • 双目门禁与数据库服务器通信采用TCP长连接,通信端口6669。
  • 双目门禁电脑客户端升级通信采用TCP短连接,通信端口6670。
  • 检测测试与手机app或者其他客户端通信采用TCP长连接,通信端口6671。

二、功能特点

  1. 支持的功能包括人脸识别、人脸比对、人脸搜索、活体检测等。
  2. 在线版还支持身份证、驾驶证、行驶证、银行卡等识别。
  3. 在线版的协议支持百度、旷视,离线版的支持百度,可定制。
  4. 除了支持X86架构,还支持嵌入式linux比如contex-A9、树莓派等。
  5. 每个功能的执行除了返回结果还返回执行用时时间。
  6. 多线程处理,通过type控制当前处理类型。
  7. 支持单张图片检索相似度最高的图片。
  8. 支持指定目录图片用来生成人脸特征值文件。
  9. 可设置等待处理图片队列中的数量。
  10. 每次执行都有成功或者失败的信号返回。
  11. 人脸搜索的返回结果包含了原图+最大相似度图+相似度等。
  12. 人脸比对同时支持两张图片和两个特征值比对。
  13. 相关功能自定义一套协议用于客户端和服务端,可以通过TCP通信进行交互。
  14. 自定义人脸识别协议非常适用于中心一台服务器,现场若干设备请求的场景。
  15. 每个模块全部是独立的一个类,代码整洁、注释完善。

三、效果图

四、相关站点

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  5. 体验地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652

五、核心代码

void FaceLocalArm::imgToBgr(const QImage &img, quint8 *bgr, int w, int h)
{for (int i = 0; i < h; ++i) {const quint8 *scanline = img.scanLine(i);for (int j = 0; j < w; ++j) {*bgr++ = scanline[j * 3 + 0];*bgr++ = scanline[j * 3 + 1];*bgr++ = scanline[j * 3 + 2];}}
}void FaceLocalArm::bgrToYuv(quint8 *yuv, const quint8 *bgr, int w, int h)
{int b, g, r;for (int i = 0; i < w * h; ++i) {b = bgr[3 * i + 0];g = bgr[3 * i + 1];r = bgr[3 * i + 2];yuv[i] = (quint8)((r * 30 + g * 59 + b * 11 + 50) / 100);}
}void FaceLocalArm::init()
{//如果已经正常则无需初始化if (isOk) {return;}
#ifdef __arm__int res = CRface::FaceDetect_Init_ColorReco(sdkPath.toStdString());if (res != 1) {qDebug() << TIMEMS << QString("FaceDetect_Init_ColorReco error: %1").arg(res);} else {qDebug() << TIMEMS << "FaceDetect_Init_ColorReco ok";res = CRface::FaceReco_Init_ColorReco(sdkPath.toStdString());if (res != 1) {qDebug() << TIMEMS << QString("FaceReco_Init_ColorReco error: %1").arg(res);} else {isOk = true;qDebug() << TIMEMS << "FaceReco_Init_ColorReco ok";}}emit sdkInitFinsh(isOk);
#endif
}bool FaceLocalArm::getFaceRect(const QString &flag, const QImage &img, QRect &rect, int &msec)
{if (!isOk) {return false;}
#ifdef __arm__//qDebug() << TIMEMS << flag << "getFaceRect";QTime time;if (countTime) {time.start();}int w = img.width();int h = img.height();//这里有隐患,如果图片像素特别大会崩溃,应该改为quint8 *bgr=(quint8 *)calloc(w * h * 3, 1);然后后面free(bgr);quint8 yuv[w * h];quint8 bgr[w * h * 3];imgToBgr(img, bgr, w, h);int facebox[32 * 5];bgrToYuv(yuv, bgr, w, h);facebox[0] = 0;int result = 0;if (findFast) {result = CRface::FaceDetect_Fast_ColorReco(yuv, w, h, facebox, true);} else {result = CRface::FaceDetect_Normal_ColorReco(yuv, w, h, facebox, true, w / percent);}if (result == 1) {rect = QRect(facebox[1], facebox[2], facebox[3], facebox[4]);msec = getTime(time);return true;}
#endifreturn false;
}bool FaceLocalArm::getFaceFeature(const QString &flag, const QImage &img, QList<float> &feature, int &msec)
{if (!isOk) {return false;}
#ifdef __arm__//qDebug() << TIMEMS << flag << "getFaceFeature" << img.width() << img.height() << img.size();QTime time;if (countTime) {time.start();}int w = img.width();int h = img.height();//这里有隐患,如果图片像素特别大会崩溃,应该改为quint8 *bgr=(quint8 *)calloc(w * h * 3, 1);然后后面free(bgr);quint8 yuv[w * h];quint8 bgr[w * h * 3];imgToBgr(img, bgr, w, h);int facebox[32 * 5];bgrToYuv(yuv, bgr, w, h);facebox[0] = 0;int result = 0;if (findFast) {result = CRface::FaceDetect_Fast_ColorReco(yuv, w, h, facebox, true);} else {result = CRface::FaceDetect_Normal_ColorReco(yuv, w, h, facebox, true, w / percent);}if (result == 1) {QRect rect = QRect(facebox[1], facebox[2], facebox[3], facebox[4]);msec = getTime(time);emit receiveFaceRect(flag, rect, msec);float fea[256];int result = CRface::FaceReco_Extract_ColorReco(bgr, w, h, facebox + 1, fea);if (result == 256) {feature.clear();for (int i = 0; i < 256; i++) {feature.append(fea[i]);}msec = getTime(time);return true;}} else {emit receiveFaceRectFail(flag);}
#endifreturn false;
}float FaceLocalArm::getFaceCompare(const QString &flag, const QList<float> &feature1, const QList<float> &feature2)
{if (!isOk) {return 0;}
#ifdef __arm__//qDebug() << TIMEMS << flag << "getFaceCompareXXX";float fea1[256], fea2[256];for (int i = 0; i < 256; i++) {fea1[i] = feature1.at(i);fea2[i] = feature2.at(i);}float result = CRface::FaceReco_Match_ColorReco(fea1, fea2);result = result * 100;//过滤非法的值result = result > 100 ? 0 : result;return result;
#endifreturn 0;
}

mega2560电脑识别不到端口后_Qt音视频开发41-人脸识别嵌入式相关推荐

  1. Qt音视频开发39-人脸识别在线版

    一.前言 关于人脸识别这块,前些年不要太火,哪怕是到了今天依然火的一塌糊涂,什么玩意都要跟人脸识别搭个边,这东西应该只是人工智能的一个很小的部分,人脸识别光从字面上理解就是识别出人脸区域,其实背后真正 ...

  2. Qt音视频开发42-人脸识别客户端

    一.前言 人脸识别客户端程序,不需要和人脸识别相关的库在一起,而是通过协议通信来和人脸识别服务端通信交互,人脸识别客户端和服务端程序框架,主要是为了提供一套通用的框架,按照定好的协议,实现人脸识别的相 ...

  3. Qt音视频开发40-人脸识别离线版

    一.前言 上一篇文章写了在线调用人脸识别api进行处理,其实很多的客户需求是要求离线使用的,尤其是一些事业单位,严禁这些刷脸数据外泄上传到服务器,尽管各个厂家号称严格保密这些数据,但要阻止这些担心,唯 ...

  4. ffmpeg 命令_Qt音视频开发11-ffmpeg常用命令

    一.前言 大部分的格式转换工具比如格式化工厂等,都用到了ffmpeg来处理,ffmpeg编译后生成的ffmpeg.exe.ffplay.exe.ffprobe.exe等可执行文件,其实就封装了众多牛逼 ...

  5. c++ vlc读取摄像头_Qt音视频开发1-vlc解码播放

    ## 一.前言 最开始接触视频监控这块的时候,用的就是vlc作为解码的内核,主要是因为vlc使用简单方便,直接传入一个句柄即可,简单几行代码就可以实现一个视频流播放,很适合初学者使用,也推荐初学者用q ...

  6. ffmpeg获取设备支持的分辨率_Qt音视频开发6-ffmpeg解码处理

    一.前言 采用ffmpeg解码,是所有视频监控开发人员必备的技能,绕不过去的一个玩意,甚至可以说是所有音视频开发人员的必备技能.FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开 ...

  7. OpenCV中视频操作及人脸识别案例

    目录 OpenCV中视频操作及人脸识别案例 视频操作 视频读写 从文件中读取视频并播放 保存视频 小结 视频追踪 meanshift Camshift 算法总结 小结 案例:人脸案例 人脸识别基础 实 ...

  8. Python 计算机视觉(十六)—— 图像和视频中的人脸识别

    参考的一些文章以及论文我都会给大家分享出来 -- 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习,一起 ...

  9. 微信小程序开发工具结合腾讯云开发AI人脸识别和身份证识别——基于腾讯云开发者实验项目

    微信小程序开发工具结合腾讯云开发AI人脸识别和身份证识别--基于腾讯云开发者实验项目 开通腾讯云相关权限(AI人脸识别,文字识别-身份证识别) 查看API密钥 部署微信小程序 成功演示 代码包 开通腾 ...

最新文章

  1. 深度学习笔记二:PAC,PAC白化,ZCA白化
  2. css显示内容越来越模糊_纯干货,前端学者的福音!如何使用css滤镜改变图片颜色...
  3. python面试题之你如何管理不同版本的代码?
  4. 专访OPPO Find X5产品经理:深耕自研芯片 以最高标准打造极致旗舰体验
  5. 学python需要什么基础-零基础学Python应该学习哪些入门知识及学习步骤安排
  6. HTTP状态码介绍详细
  7. Scala学习——隐式转换
  8. 每日一练||第二周汇总
  9. linux 下查看硬盘容量
  10. 朴素贝叶斯以及它的三个模型
  11. 阿里云磁盘异常爆满的原因及解决方法
  12. linux 下安装mysql相关笔记
  13. python36.dll 0xc000005_使用python运行时出现0xc000005错误
  14. html5 手机uc浏览器 复制链接,删除手机UC浏览器强制插入关键词链接的方法
  15. android 权限模型,android-棉花糖权限模型在Airbnb中的AccountManager getAccounts()异常,该怎么做?...
  16. VS CODE下 无法执行 node-gyp 命令
  17. 业精于勤,荒于嬉。行成于思,毁于随。
  18. 极大似然函数求解_从最大似然函数 到 EM算法详解
  19. android go预览版下载地址,Android 11 Go正式版-Android 11 Go安卓正式版预约 v1.0.0-友情手机站...
  20. XP下超级终端的配置

热门文章

  1. 【ES】ES 运用search_after来进行深度分页
  2. 【Flink】Flink 上海会议 【视频笔记】
  3. 60-140-044-使用-DataSink-使用OutputTag进行Side Output(侧输出)
  4. 【Flink】Flink checkpoint was declined
  5. Spring : Spring @Transactional-事物回滚
  6. 使用 Spring Boot Security 进行安全控制
  7. RocKetMQ : MQClientException: The producer service state not OK, CREATE_JUST
  8. java的代理Proxy.newProxyInstance
  9. 05-IntelliJ IDEA清空项目缓存
  10. linux sem函数,linux下信号量及其SEM_UNDO标志