成果展示:

如下视频所示为制作好的人脸跟踪电风扇

人脸跟踪风扇

相关代码已经放在百度网盘上面了。

链接:https://pan.baidu.com/s/188AylEd2QgOiA6YFv01N3A

提取码:e2og

主要原理

其主要原理就是,摄像头对风扇前面的内容进行预览,树莓派对摄像头拍到的画面进行实时的检测,检测出人脸的位置。然后根据位置来控制云台的转动,从而达到风扇始终对着人脸的目标。

原理示意图:

树莓派通过检测人脸位置,大致判断人脸相对自己的位置,然后转换成角度,控制云台运动。

代码编写:

这里主要看一下最重要的代码,就是在获取到一帧图像之后的处理流程,我把它放在slot_camera方法中

    1    def slot_camera(self):2             if (self.cap.isOpened()):3              self.frame  += 14               # get a frame5              ret, img = self.cap.read()6                 height, width, bytesPerComponent = img.shape7               bytesPerLine = bytesPerComponent * width8               9               if self.frame % 1 == 0:10                   image_p = img.ctypes.data_as(ctypes.c_char_p)11                     self.alg_handle.alg_run.restype = ctypes.POINTER(ctypes.c_float)12                  result = self.alg_handle.alg_run(image_p, 11, height, width, 4)13                   14                  # cls15                     if int(result[0]) == 0:16                       pass17                  # det18                     elif int(result[0]) == 1:19                         box_count = int(result[1])20                        for j in range(box_count):21                            cls = int(result[2 + j * 6 + 0])22                          prob = float(result[2 + j * 6 + 1])23                           if prob < 0.4:24                                 continue25                          x1 = int(float(result[2 + j * 6 + 2]) * width)26                            y1 = int(float(result[2 + j * 6 + 3]) * height)27                           x2 = int(float(result[2 + j * 6 + 4]) * width)28                            y2 = int(float(result[2 + j * 6 + 5]) * height)29                           cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 1)30                            x_center = (float(result[2 + j * 6 + 2]) + float(result[2 + j * 6 + 4])) / 231                          y_center = (float(result[2 + j * 6 + 3]) + float(result[2 + j * 6 + 5])) / 232                          x_angle = int((x_center - 0.5) * 40 / 0.5)33                            y_angle = int((y_center - 0.5) * 40 / 0.5)34                            self.servo_cmd['x_dir'] = 'left' if x_angle <= 0 else 'right'35                          self.servo_cmd['x_angle'] = abs(x_angle)36                          37                  cv2.cvtColor(img, cv2.COLOR_BGR2RGB, img)38                     cv2.putText(img, 'x:%s %d'%( self.servo_cmd['x_dir'], self.servo_cmd['x_angle']), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 2)39                    ServoControl('x', self.servo_cmd['x_dir'], self.servo_cmd['x_angle'])40                 41              self.image = QImage(img.data, width, height, bytesPerLine, QImage.Format_RGB888)42              self.label_frame.setPixmap(QPixmap.fromImage(self.image).scaled(self.label_frame.width(), self.label_frame.height()))43        44

DIY人脸跟踪电风扇送女朋友(4)相关推荐

  1. DIY人脸跟踪电风扇送女朋友(1)

    女朋友的生日快到了,作为一个屌丝程序员,想要送给女朋友一个特别的礼物,最终结合现在火热的深度学习技术,选择做一个人脸跟踪电风扇,能够跟踪人脸,始终对着人脸吹,让女友无时无刻不感受到"清风徐来 ...

  2. DIY人脸跟踪电风扇送女朋友(3)

    下面要重点介绍一下深度学习技术以及yolov3目标检测网络 深度学习技术: 深度学习技术实际上是从早期的人工神经网络发展而来的.本质上就是用一个函数去拟合输入(图片)到结果(目标框)的映射.因为函数本 ...

  3. DIY人脸跟踪电风扇送女朋友(2)

    接着之前的内容,我们来编写一下云台控制的代码.实际上由于安装了开源的Adafruit_Python_PCA9685模块,操作舵机非常的简单.这里我们把舵机的控制分成x轴和y轴,x轴可以像左或者向由旋转 ...

  4. 【数学建模】DIY人脸识别(原创)

    文章目录 题目 论文:DIY人脸识别技术 摘 要 1.问题的重述 2.问题的分析 3.模型的假设与符号说明 4.模型的准备 4.1 基于Adaboost算法的Haar强特征级联分类器 4.2Adabo ...

  5. TensorFlow实时任意风格迁移,送女朋友的创意礼物有了

    TensorFlow实时任意风格迁移,送女朋友的创意礼物有了 前言 自适应实例规范化 风格迁移网络 编码器结构与实现 通过反射填充(reflection padding)减少块伪影 解码器结构与实现 ...

  6. 【深度学习】DIY 人脸识别技术的探索(一)

    [深度学习]DIY 人脸识别技术的探索(一) 文章目录 摘要 问题重述 模型假设 定义与符号说明 问题分析 模型的建立与求解 参考 摘要 伴随着人工智能技术的发展,人们对信息安全有了更高的要求,传统的 ...

  7. 【深度学习】DIY 人脸识别技术的探索(二)

    [深度学习]DIY 人脸识别技术的探索(二) 文章目录 训练模型 工具 结果展示 问题二的模型建立与求解 基于 KNN 的人脸识别模型 训练模型 MTCNN 可以并行训练(3 个网络同时训练,前提是内 ...

  8. 非刚性人脸跟踪 —— 实用工具

    面向对象设计 与人脸检测和人脸识别一样,人脸跟踪也由两部分组成:数据和算法.算法通过预先储存(即离线)的数据来训练模型,然后对新来的(即在线)数据执行某类操作.因此,采用面向对象设计是不错的选择. 在 ...

  9. 非刚性人脸跟踪 —— 人脸跟踪

    人脸跟踪问题可认为是寻找一种高效和鲁棒性的方法,它能将各种面部特征的单独检测与这些特征的几何依赖性结合起来,已得到连续帧中每幅图像面部特征位置的精确估计.基于此,需仔细考虑几何依赖性的必要性.下图为用 ...

最新文章

  1. 董小姐的空调不一定能当发电站,但牛放屁确实可以发电
  2. 用Android自带的signapk.jar + .x509.pem + .pk8签名应用程序
  3. SwiftUI之深入解析高级动画的几何效果GeometryEffect
  4. 下单问题分析及解决方式
  5. Thread的run()与start()的区别
  6. 7种有害的IT团队行为,不根除就坏大事了
  7. linux mint 18安装中文,无法在Linux Mint 18.1“Serena”下安装pyFFTW
  8. java单人多人聊天_java简单多人聊天
  9. 常见花材的固定的方法有哪些_什么是zeta电位?常见zeta电位分析方法有哪些?...
  10. mstsc远程桌面全频或自定义窗口
  11. windows搭建FTP
  12. python列表逐个输出_python的列表元素输出
  13. python画小树_如何用Python画一颗小树?
  14. 大学英语专业开计算机课程吗,加拿大留学,温莎大学英语计算机专业了解一下!...
  15. LeetCode455分发饼干
  16. excel表格内容拆分_3个动图,教你学会如何让excel表格自动拆分,学会它,小白变大神...
  17. Android 画椭圆
  18. 海盗分椰子c语言编程,水手分椰子——迭代法、递归解题(示例代码)
  19. 云付注册推荐人怎么填?云付新手怎么操作
  20. 大学生创业之火如何再次燎原

热门文章

  1. android retrofit2.0 rxjava2,Android - 网络请求之 Retrofit2 + RxJava
  2. java soap 头_如何在Java中添加Soap标头
  3. 圆点html span,HTML span 标签
  4. web前端自学入门视频教程分享
  5. 按钮配置之自定义按钮使用(一)——JEPLUS软件快速开发平台
  6. Tomcat8.01及nginx-1.8.1安装
  7. 为什么敏捷开发在亚洲实行不了
  8. 基于DirectShow的局域网内音视频流的多机共享
  9. 【VLC-Android】vlc-android简例
  10. Origin null is not allowed by Access-Control-Allow-Origin 解决方法