一、前言

最近需要在 Linux 平台下开发一个人脸识别相关的应用,用到了虹软的人脸识别 SDK。之前在 Windows 平台用过,感觉不错,SDK 里面还带了 Demo 可以快速看到效果。打开 Linux 版本的 SDK 里面没有发现 Demo,于是想着把 Windows 的 Demo 移植到 Linux。这篇文章记录了移植的过程,Linux 用的是 Ubuntu 20.04(使用虚拟机 VMware Workstation 15 Player)。

二、配置依赖

2.1 ArcFace SDK

到虹软官网下载人脸识别 SDK 3.1 Linux 增值版本 解压到合适的目录,并从官网获取 APP_ID、SDK_KEY 和 ACTIVE_KEY,用于写到配置文件用来激活 SDK。

2.2 OpenCV

到 OpenCV 官网下载源码,我用的版本是 3.4.9。可以按照官网的教程 Installation in Linux 自行编译,我参考官网教程使用下面的这些命令在 GCC 9.3.0(Ubuntu 20.04 自带的编译器) 上编译成功。

  1. sudo apt update
  2. sudo apt install build-essential
  3. sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
  4. cd <OpenCV 源码目录>
  5. mkdir build
  6. cd build
  7. cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<自定义目录> ..
  8. make -j3 # 可以使用核心数 - 1 个线程来编译
  9. sudo make install

2.3 Qt

Qt 使用的是 5.14.2 版本。

三、项目文件

3.1 .pro 文件

原 Windows Demo 使用的是 Visual Studio 2015,在 Linux 下我这里用到了 Qt Creator 进行开发,因此需要编写 .pro 文件,包括以下几个方面:

  • 用到的 Qt 模块
  • 编译出来的程序名
  • 用到的头文件、源文件和资源文件
  • 依赖库的头文件及库名

更具体的内容查看文末提供的源码。

3.2 文件编码

原源码文件使用的是 GBK 编码,需要转换为 UTF-8 编码。将下面的命令保存到 convert.sh 文件中并用 chmod u+x convert.sh 赋予可执行权限。

  1. #!/bin/bash
  2. for i in "$@"; do
  3. desc=$(file "$i")
  4. if $(echo $desc | grep -i "UTF-8 Unicode" > /dev/null); then
  5. if $(echo $desc | grep -i "(with BOM)" > /dev/null); then
  6. echo "Remove UTF-8 BOM: " $i
  7. sed -i "1s/^\xef\xbb\xbf//" "$i"
  8. fi
  9. elif $(echo $desc | grep -i "ISO-8859" > /dev/null); then
  10. echo "GBK --> UTF-8 : " $i
  11. temp=temp.txt
  12. iconv -f gbk -t utf-8 -o "$temp" "$i"
  13. mv "$temp" "$i"
  14. fi
  15. done

在源码根目录下运行 find . -type f \( -name "*.h" -o -name "*.cpp" \) | xargs -I{} ./convert.sh "{}" 将所有的文件的编码从 GBK 转为 UTF-8,并去除现有 UTF-8 文件的 BOM 头。

四、代码修改

到这里已经可以用 Qt Creator 打开项目了,但在代码中还存在一些问题,一方面是原代码使用了一些 Windows 平台特有的 API,一方面是有些代码在 Linux 有兼容性问题。先去除 Windows 特有的依赖到编译通过,再补充必要的依赖,最后解决兼容性问题。

4.1 修改报错直至编译通过

直接进行编译,逐步解决编译错误,通过下面的方式可以解决编译错误:

  • 删除 Utils.cpp 中报错的头文件、GUID 宏、listDevices 函数的主体、UTF8_To_string 和 string_To_UTF8 函数。
  • 将所有包含的 qDebug 改为 QDebug
  • Sleep(milli) 改为 std::this_thread::sleep_for(std::chrono::milliseconds(milli))
  • 删除 MSVC 的链接库的编译指令 #pragma comment ...
  • 将原来使用 OpenCV 2 的接口迁移到目前的 OpenCV 3。
    • IplImage 到 cv::Mat 的转换由 cv::Mat mat(ipl, false) 改成 cv::Mat mat = cv::cvarrToMat(ipl)
    • cv::Mat 到 IplImage 的转换由 IplImage(mat) 改成 cvIplImage(mat),在原来的代码里 cv::Mat 转为 IplImage 后有个取地址,对右值取地址是不安全的,需要用一个变量保存转换后的值再对这个变量取地址。
    • 在调用 cvRectangle 时将 CV_RGB 改成 cvScalar
    • 使用 cv::cvtColor 需要额外包含头文件 opencv2/imgproc.hpp
    • 使用 cv::VideoCapture 需要额外包含头文件 opencv2/videoio.hpp
  • strcpy_s 改成 strncpy,仅有参数位置上的改变。
  • TRUE 改为 true,将 FALSE 改为 false

改了编译错误后,忽略警告已经可以编译通过了,接下来是补充刚才删除的一些必要依赖及解决兼容性问题。

因为环境差异,可能出现错误的顺序不一致,但基本上是上面提到的错误之一。

4.2 重新实现获取摄像头列表的函数

原 Windows Demo 使用了 Windows 特有的 dshow 来查找摄像头,在这里直接用 cv::VideoCapture 尝试打开来获取摄像头的索引:

  1. auto list = std::vector<int>();
  2. for (auto i = 0; i != 10; ++i)
  3. {
  4. auto cap = cv::VideoCapture(i);
  5. if (cap.isOpened()) { list.emplace_back(i); }
  6. cap.release();
  7. }

Demo 可以只打开一个RGB摄像头,也可以同时打开一个RGB摄像头和一个IR摄像头。原代码保存获取摄像头的名称,仅用来统计数量,具体打开哪个摄像头是通过settings.ini文件来配置的。在改变探测摄像头存在的数量的方式后,顺带改变了打开摄像头的逻辑,仅一个摄像头就认为是仅打开普通摄像头。在settings.ini文件中配置两种摄像头的索引,如果索引为 -1,则自动把小的索引认为是普通摄像头,大的索引认为是红外摄像头,如果和真实情况不一致可手动指定摄像头索引。

settings.ini文件在后面运行 Demo 时会有更多的说明。

4.3 修复弹出文件选择框失败的兼容性问题

在 Ubuntu 20.04 下,Qt 的 QFileDialog::getOpenFileName 和 QFileDialog::getExistingDirectory 存在一些问题,在打开时会卡死界面,通过将最后一个参数设置为 QFileDialog::DontUseNativeDialog 可以解决这个问题。

五、运行 Demo

5.1 界面预览

5.2 配置

  1. 配置文件已经随源码打包好了,在运行时需要移动到可执行程序所在的同级目录下。
  2. 在配置文件中填入官网获取的 APP_ID、SDK_KEY 和 ACTIVE_KEY。
  3. 编译并运行。

六、源码下载

基于官方windows Qt Demo修改后的源码

虹软人脸识别——官方 Qt Demo 移植到 Linux的更多相关文章

  1. Android开发 打开已存在的项目(以虹软人脸识别sdk的demo为例)

    详细流程参考博客https://blog.csdn.net/z979451341/article/details/79468785 个人遇到的问题与注意点 1.下载Demo后忘记修改appid和sdk ...

  2. 虹软人脸识别 - Android Camera实时人脸追踪画框适配

    在使用虹软人脸识别Android SDK的过程中 ,预览时一般都需要绘制人脸框,但是和PC平台相机应用不同,在Android平台相机进行应用开发还需要考虑前后置相机切换.设备横竖屏切换等情况,因此在人 ...

  3. 虹软人脸识别SDK接入Milvus实现海量人脸快速检索

    一.背景 人脸识别是近年来最热门的计算机视觉领域的应用之一,而且现在已经出现了非常多的人脸识别算法,如:DeepID.FaceNet.DeepFace等等.人脸识别被广泛应用于景区.客运.酒店.办公室 ...

  4. Android 关于虹软人脸识别SDK引擎使用总结

    虹软 最近开放了人脸识别的SDK引擎(免费的哦),刚好有Android版的,就体验了一波.下面来说说Android版的SDK使用心得: ArcFace 虹软人脸认知引擎简介 目前开放的版本有人脸比对( ...

  5. 记C# 调用虹软人脸识别 那些坑

    上一个东家是从事安防行业的,致力于人工智能领域,有自主人脸识别.步态识别的算法.C++同事比较称职有什么问题都可以第一时间反馈,并得到合理的处理,封装的DLL 是基于更高性能的GPU算法,可支持更多线 ...

  6. 虹软人脸识别SDK在网络摄像头中的实际应用

    目前在人脸识别领域中,网络摄像头的使用很普遍,但接入网络摄像头和人脸识别SDK有一定门槛,在此篇中介绍过虹软人脸识别SDK的接入流程,本文着重介绍网络摄像头获取视频流并处理的流程(红色框内),以下内容 ...

  7. 虹软人脸识别 - faceId及IR活体检测的更新介绍

    虹软人脸识别 - faceId及IR活体检测的介绍 前几天虹软推出了 Android ArcFace 2.2版本的SDK,相比于2.1版本,2.2版本中的变化如下: VIDEO模式新增faceId(类 ...

  8. 虹软人脸识别 - faceId及IR活体检测的介绍

    虹软人脸识别 - faceId及IR活体检测的介绍 前几天虹软推出了 Android ArcFace 2.2版本的SDK,相比于2.1版本,2.2版本中的变化如下: VIDEO模式新增faceId(类 ...

  9. 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)

    前言 大家应该都知道几个很常见的例子,比如在张学友的演唱会,在安检通道检票时,通过人像识别系统成功识别捉了好多在逃人员,被称为逃犯克星:人行横道不遵守交通规则闯红灯的路人被人脸识别系统抓拍放在大屏上以 ...

随机推荐

  1. MVC案例之多个请求对应一个servlet

     CustomerServlet package com.aff.mvcapp.servlet; import java.io.IOException; import java.lang.reflec ...

  2. Alpha冲刺 —— 5.6

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.展 ...

  3. Java实现 蓝桥杯VIP 算法提高 研究兔子的土豪

    试题 算法提高 研究兔子的土豪 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 某天,HWD老师开始研究兔子,因为他是个土豪 ,所以他居然一下子买了一个可以容纳10^18代兔子的巨大 ...

  4. Java实现 蓝桥杯 算法训练 字串统计

    算法训练 字串统计 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最 ...

  5. Java实现 LeetCode 417 太平洋大西洋水流问题

    417. 太平洋大西洋水流问题 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的 ...

  6. Java实现 LeetCode 74 搜索二维矩阵

    74. 搜索二维矩阵 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: ...

  7. Java实现 LeetCode 63 不同路径 II(二)

    63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...

  8. java实现第六届蓝桥杯密文搜索

    密文搜索 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...

  9. Java实现第八届蓝桥杯9算数式

    9算数式 题目描述 观察如下的算式: 9213 x 85674 = 789314562 左边的乘数和被乘数正好用到了1~9的所有数字,每个1次. 而乘积恰好也是用到了1~9的所有数字,并且每个1次. ...

  10. Tidyverse| XX_join :多个数据表(文件)之间的各种连接

    本文首发于公众号:“生信补给站” Tidyverse| XX_join :多个数据表(文件)之间的各种连接 前面分享了单个文件中的select列,filter行,列拆分等,实际中经常是多个数据表,综合 ...