前言

这是帮学妹做的一个毕业设计,觉得有趣就接了。功能较为简单,更像是一个带了人脸识别功能的行车记录仪。从18年12月开始做,大部分代码在3月写出来,到现在大概花了20个工作日的样子。期间从零开始学了C++和QT,opencv也经历了从C版本到C++版本,收获不小。这算是我第一个独立的“产品”。

目前只完成了ubuntu14.04系统下的功能,还没有移植树莓派做屏幕适配等,也没有进行自己的人脸特征运算。用的还是opencv的样例代码。

详细功能有:人脸检测,循环录像,日志生成以及qt界面操作。

本文的目的是整理一下:学习经历,开发思路,经验总结,难点和坑,为了代码重构做准备。

第一章 环境搭建

最简单的是helloworld,最难的也是helloworld。开发环境真的是最头疼的。

第一节 ARM板选择

说来惭愧,嵌入式专业的没用过ARM开发板,之前有过一个韦东山的,但到手就退掉了。

选择的标准就是有触屏,ARM9。最开始出于价格因素,买了周立功的easyArm m283a。可以说,忙活了一个月发现板子根本没法用,或者说压根不适合初学者。缺点如下:

  1. 系统过老,还是linux2.4的版本,应该是周立功公司自己的发行版。
  2. 文件系统默认只读,而且有很多命令,文件夹位置,结构和常见的debian系不一样。
  3. 没有社区,找不到参考内容和参考项目。
  4. 烧写系统繁琐,成功率低,需要人为更换跳冒。
  5. 没有hdmi接口,触屏只能用周立功自己公司的。
  6. 官网的手册是14年的,现在系统更新后很多命令和文件路径找不到。

所以这就很蛋疼了,不得不说周立功的开发手册写的还可以。一步步教你,但最大的问题就是,不通用。这个开发板给我的感觉更像是一片周立功自己生产的单片机。还好没让学妹直接也买了,最后这个板子亏了一百块钱卖掉了。其实都是ARM板子,为什么不能用呢,其实可以从上面的缺点总结出来。

  1. 有些东西是对应系统版本的,装opencv和qt会遇到很大的阻碍。
  2. 文件系统定制化,意味着一些通用性的解决方案无法实行。
  3. 没社区,意味着没有解决办法,我基本是基于百度编程。
  4. 烧次系统要老命了,效率低,还要对照手册改跳冒。
  5. 没有hdmi意味着没有桌面,触屏也无法实现桌面,这个定制的系统只能通过ssh或者串口操作。
  6. 通用方法无法解决,社区无法解决,手册也无法解决问题,靠烧香么?

总而言之,恰好学妹又送了个树莓派给我当礼物,解决了以上的所有问题。有问题不可怕,问题是无法解决问题。

第二节 摄像头选择

这个没什么好说的,用UVC协议的摄像头就可以,LINUX有个啥V4L的系统驱动还是啥,脸上就能用。在公司随便拿了一个USB摄像头也能用,没啥具体问题。

唯一的问题就是学妹买同款摄像头的时候,焦距和我的不同,买成了鱼眼的。

第三节 opencv与qt环境搭建

这两个为什么放在一起呢?因为qt的版本竟然和opencv的版本有关联,QT5对应OPENCV3。是我大学同学的群里面给我解答的。

opencv自然是要编译安装,最早我都安装在了树莓派上,当时没有动态链接库之类的概念,重复装了很多次。最开始是盲目的敲命令,后来想明白了,是先通过cmake生成makefile,然后执行make安装。中间有很多配置参数,这个可以以后仔细说说。后面的就是配置动态链接库的位置,和pkg-config包。这一步学妹的电脑是种配置不好,我没搞明白究竟是我这边的问题还是她操作有误。我在自己的vbox虚拟机和两个wm虚拟机都配置成功了,树莓派也安装成功。

最先安装的事opencv2,出于喜欢用c的缘故,想用c来写。通过几个简单的C例子,入门了opencv库中的简单图像处理和人脸识别的功能。然后由于不兼容qt5的问题,重新安装opencv3.4.5,又重新做了一遍sample文件夹里面的例子。二者还是有很多不同的,比如数据结构的名称,库的更名,函数名更新。

总之,运行成功后安装qt5,自己写了几个类测试了opencv在qt程序中运行正常。qt倒是一键安装,要设置的是每一个qt项目的pro文件中的include和lib。具体位置要按照自己的安装路径来,最好所有的都直接包含进去。比如ls *.so得到所有动态链接库。

可能几百字就概括好了,但实际上将近两个多月才装好,测试好。

  1. 版本更新太快,版本过多。
  2. 网上的解决方案都是根据自己的环境来的,除非环境一样,无法通用。
  3. 多个库联合起来用,就不是1+1=2这么简单了,可能有不同的版本支持。
  4. 不了解linux系统本身。

第四节 树莓派交叉编译环境

说实在,写这篇文章的时候,才头一次使用交叉编译,作为一个嵌入式专业的学生是挺不应该。。。

卡了大概4天,因为网上的教程都是要装32位的编译方式,想了想应该是应对老版本的raspberry系统,64位应该是今年才成熟的。直接用自带的x64交叉编译链就可以了。剩余的还没想明白,还有怎么生成不依赖动态库的打包程序。以后再说。

总之,今天写出了helloworld。

现在遇到的问题是交叉编译qt源码遇到了瓶颈。

最后没有解决这些问题,出于无奈,我只好在树莓派上装了qtcreator和opencv,直接编译源码,时间来不及了。

第二章 功能逻辑

第一节 应用场景

其实最早想做的是人流统计这种功能,脑子里没有概念,具体想法只有:摄像头+arm+触屏。后来出于能力问题,只能做到人脸检测的部分。思路就是,循环检测每一帧同屏人脸,然后进行计数,取采样周期的中位数来确定区间内的人脸数。

与其说是人脸识别系统,做到最后发现,更像个是有人脸检测功能的行车记录仪。因为预定的视频播放管理等功能,来不及实现,只实现了日志的生成和读取,以及循环录像,以及一个前端页面。

第二节 功能流程图

这是写完所有功能再按照代码逻辑画出来的,写的时候并没有先想好。

其实期间也重构过一次代码,最开始是按照c的思路写的,几个类并没有封装好,面向对象用的还是不熟练。

整体的框架是网上复制过来的,包含了读帧的部分,里面涉及opencv的Mat和Qt图像的格式转换等步骤。现在看看逻辑还是很简单的,几个按钮对应的信号槽。摄像头类有摄像头开启关闭,视频帧抓取,录像,以及释放各种对象的操作。日志类什么的也是一样的原理,设计文件读写。

第三章 开发流程

第一节 测试opencv代码

从opencv2到opencv3,代码格式有着巨大的变化,c下的代码还是维持在结构体作为数据结构,以函数的形式编程。而3全部改为面向对象,使得很多功能可以配合C++的容器来实现。期间最大的问题不是opencv库的使用,而是opencv的编译安装和环境配置。我先写了两个测试类,分别测试图像的处理和摄像头的调用。

首先人脸识别其实是对于每个视频帧进行处理,本质上还是图像处理的一种,先把图像转化为灰度图,然后执行检测函数。

然后摄像头的调用,涉及到了录像的videowriter类,调用了就要释放,主要是内存管理的问题。期间出现了很多不好检测的段错误,大多数都是因为对迭代器和图像对象使用错误,比如迭代器越界,和录像对象没有正常关闭。代码的健壮性不是很好。

第二节 制作qt界面

qt的部分,主要由于qtcreator的一键安装,少了很多问题。但是涉及到树莓派的交叉编译的时候遇到了很多问题,这里暂且不提。

因为用了qt自带的界面设计功能,图形化很容易就做出来了,主要的部分就是拖按钮,然后和槽函数对应,具体实现由框架来完成。每个窗体和按钮都有大量的属性,需要长时间的使用才能熟悉。不过并不复杂,没有遇到很大的问题。

值得注意的就是,qt自带的数据类型和c++,opencv的数据类型不一致,需要手动转换。如qt的date和string,再生成文件的时候要用c++的string或者char *,这个需要注意。或许也有直接生成标准类型的函数,但是没有仔细探究。

对于opencv和qt图像格式的转换,设计到一些现有数字图像类型的原理,很多参数都是知其然不知其所以然。但好在还是能找到解决方案的。

第三节 设计具体功能

环境装好,界面设计好,功能其实很好写的,没有什么技术问题,主要的是业务问题。在设计初期并没有考虑好诸如:怎么殉难换录像,需要什么样的日志,这些没思考过。最后还是装成买家去问淘宝客服,实在惭愧。

还有个一直以来的问题,没有一个成熟的设计思想。比如我这个循环录像的类,和图像处理类耦合在一起了,我不清楚怎么把他们分开,还有关于多线程,并行运行的。比如一边播放音乐一边执行动作这种,一直以来都没有什么思路。

总之有业务逻辑,无外乎是顺序流程,判断,排序,循环这些,写这些具体功能用了不到了两周时间。

第四节 树莓派调试

这个很头疼,qt远程部署,成功了一次,但是重新拷贝镜像到新的sd卡以后,再去远程部署就无法成功。

我也不知道为什么,可能还是重复的次数过少,没有经验,或者缺乏核心知识。

第四章 总结

第一节 关于opencv

其实这个人脸识别的摄像头,并没有用到很多人脸识别的功能。一直在折腾环境,最后发现opencv官网其实有一些介绍,但是英语说的,很多对于linux系统的知识并不熟悉,导致就算看懂了也不明白如何使用。不仅是opencv,很多其他库也是一样,编译安装一定是必须要过的一道坎。

第二节 关于qt

qt的ide确实很好用,如果是常规的c++程序开发,并不会遇到这么多问题。但是一旦涉及到多平台,就不像是做一个简单的界面这么容易了。细节的部分有很多,就像是前端开发一样。甚至可以当作一门语言来学了。但解决问题的过程中,反而很多还会回到linux系统的问题上。

第三节 关于嵌入式开发

与其说是嵌入式开发,更像是linux与c的关系。这和在windows下写代码真的是天差地别。从vc6.0到visualstdio,kail到arduino,windows平台的基本都是ide,都是认为设计好的工具。写了也有很久代码,并没有关注过所谓的顶层逻辑是怎么实现的。更多的是抽象层次的,内存,cpu,但是并没有详细的学习过。库是什么,链接有什么作用,深入了解一后,才发现教材中一笔带过的科普知识,背后可能是几十年科技演化的代价。

结语

可能现在舆论更在乎业务,在乎逻辑,但我觉得这些底层的知识,才是区别是否属于计算机科学与编程上岗培训。今后会继续向下挖掘的,在此之前要整理一下自己的知识点和欠缺。

基于树莓派(ARM)的人脸识别摄像头(QT5.8+OPENCV3.4.5)开发总结相关推荐

  1. 调用笔记本的摄像头实现基于opencv的视频人脸识别(中文显示和英文显示)以及 index 480 is out of bounds for axis 0 with size 480错误的解决

    @人脸识别代码和一些常见错误 基于opencv的视频人脸识别(中文显示)以及 index 480 is out of bounds for axis 0 with size 480错误的解决 参考了 ...

  2. Python人脸识别教程 - 基于Python的开源人脸识别库:离线识别率高达99.38%

    Python人脸识别教程 - 基于Python的开源人脸识别库:离线识别率高达99.38% 仅用 Python 和命令行就可以实现人脸识别的库开源了.该库使用 dlib 顶尖的深度学习人脸识别技术构建 ...

  3. 【优秀课设】基于OpenCV的Python人脸识别、检测、框选(遍历目录下所有照片依次识别 视频随时标注)

    基于OpenCV的Python人脸识别.检测.框选 (遍历目录下所有照片依次识别 视频随时标注) 移步: https://blog.csdn.net/weixin_53403301/article/d ...

  4. 树莓派人脸识别_用树莓派进行简易人脸识别

    用树莓派进行简易人脸识别 前言 简易介绍树莓派 树莓派是尺寸仅有信用卡大小的一个小型电脑,您可以将树莓派连接电视.显示器.键盘鼠标等设备使用.树莓派能替代日常桌面计算机的多种用途,包括文字处理.电子表 ...

  5. 基于PYQT编写一个人脸识别软件(2)

    前言 以前在博客:基于PYQT编写一个人脸识别软件 中给出了我自己用PYQT编写的一个小软件.鉴于使用的是开源库--face_recogniton,尽管使用很简单,但是还有些问题,比如:识别黄种人时效 ...

  6. 基于PYQT编写一个人脸识别软件

    转载请注明出处:http://blog.csdn.net/hongbin_xu 或 http://hongbin96.com/ 文章链接:http://blog.csdn.net/hongbin_xu ...

  7. 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别

    背景 目前AI 处于风口浪尖,作为 公司的CTO,也作为自己的技术专研,开始了AI之旅,在朋友圈中也咨询 一些大牛对于AI 机器学习框架的看法,目前自己的研究方向主要开源的 AI 库,如:Emgu C ...

  8. 身份验证错误错误指定的句柄无效_基于 Web 端的人脸识别身份验证「实践」

    作者:沫沫 政采云前端团队 转发链接:https://mp.weixin.qq.com/s/fRDpXixnLIy9c0Uh2tMezQ 前言 近些年来,随着生物识别技术的逐渐成熟,基于深度学习的人脸 ...

  9. android人脸识别demo_C#开发实录:基于免费SDK实现人脸识别应用开发

    随着人脸识别技术应用范围不断扩展,如何在Windows C#上基于免费SDK实现人脸识别应用开发,正成为开发者们关心的话题之一. 对于该需求,我推荐虹软视觉开放平台的ArcFace 3.0,免费.离线 ...

  10. 基于 Web 端的人脸识别身份验证

    效果展示 人脸识别效果图 前言 近些年来,随着生物识别技术的逐渐成熟,基于深度学习的人脸识别技术取得了突破性进展,准确率显著提高.现阶段,人脸识别身份验证作为非常重要的身份验证方式,已被广泛的应用于诸 ...

最新文章

  1. Java培训零基础学员必须要知道的知识点
  2. JavaScript内置一些方法的实现原理--new关键字,call/apply/bind方法--前戏
  3. Java黑皮书课后题第1章:1.1(显示三条消息)编写程序,显示Welcome to Java、Welcome to Computer Science和Programming is fun
  4. rest_framework10:base64补充/修改头像
  5. 一二三系列之状压DP——Max Correct Set(一)Neko Rules the Catniverse (Large Version)(二)Make It Ascending(三)
  6. oracle 10g rac 包root.sh报错,案例:Oracle Rac root.sh报错 Failed to create keys in the OLR
  7. Oracle数据库开机自启动
  8. Python学习日志(二)
  9. Python一个很好玩的特性decorator
  10. ati显卡驱动安装linux,在debian下安装ati显卡驱动教程
  11. 摩登天空音乐节,谁去?(更新4个舞台演出时间表)
  12. 解释什么是啸叫,为什么会发生啸叫,啸叫的为何和如何防止啸叫
  13. adb shell dumpsys activity activities调用信息分析
  14. Error starting Tomcat context. Exception
  15. 修正牛顿法及其matlab实现
  16. N1刷入Armbian(Debian11 bullseye)笔记
  17. Linux下的LVM逻辑卷管理
  18. android 软引用intent对象,Android中的软引用(SoftRefrerence)和弱引用(WeakReference)
  19. P3398 仓鼠找sugar(LCA,树剖)
  20. 手赚网试玩平台源码 可封装APP 带文章资讯功能 帝国cms7.5内核

热门文章

  1. chrome 无法拖拽离线安装本地CRX格式插件的解决方法
  2. JavaScript编程精粹
  3. 在线测试屏幕软件康佳,硬件配置强大 不是说说而已
  4. e戴尔服务器型号,【05NF18 6W2PW F750E-S0 R720 R520 DELL服务器电源模块】价格_厂家 - 中国供应商...
  5. 利用matlab实现DMD动态模态分解(在一维信号或二维流场矢量中的应用)
  6. Kademlia算法 理解 总结
  7. CSS字体:Webfont在线字体与外部字体及操作系统预装字体使用指南
  8. 广告素材优选算法在内容营销中的应用实践
  9. 如何在matlab中进行非线性规划,约束非线性规划工具-fmincon(matlab)的使用
  10. AKK菌——下一代有益菌