发 帖  
原厂入驻New

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

2020-10-7 11:13:14  187 DIY
分享
4
成果展示:
<span]相关代码已经放在百度网盘上面了。
链接:https://pan.baidu.com/s/188AyLED2QgOiA6YFv01N3A

提取码:e2og

主要原理
<span]原理示意图:
树莓派通过检测人脸位置,大致判断人脸相对自己的位置,然后转换成角度,控制云台运动。
1.jpg

代码编写:

这里主要看一下最重要的代码,就是在获取到一帧图像之后的处理流程,我把它放在slot_camera方法中
  1.     1         def slot_camera(self):
  2.     2                 if (self.cap.isOpened()):
  3.     3                     self.frame  += 1
  4.     4                     # get a frame
  5.     5                     ret, img = self.cap.read()
  6.     6                     height, width, bytesPerComponent = img.shape
  7.     7                     bytesPerLine = bytesPerComponent * width
  8.     8                    
  9.     9                     if self.frame % 1 == 0:
  10.    10                         image_p = img.ctypes.data_as(ctypes.c_char_p)
  11.    11                         self.alg_handle.alg_run.restype = ctypes.POINTER(ctypes.c_float)
  12.    12                         result = self.alg_handle.alg_run(image_p, 11, height, width, 4)
  13.    13                         
  14.    14                         # cls
  15.    15                         if int(result[0]) == 0:
  16.    16                             pass
  17.    17                         # det
  18.    18                         elif int(result[0]) == 1:
  19.    19                             box_count = int(result[1])
  20.    20                             for j in range(box_count):
  21.    21                                 cls = int(result[2 + j * 6 + 0])
  22.    22                                 prob = float(result[2 + j * 6 + 1])
  23.    23                                 if prob < 0.4:
  24.    24                                     continue
  25.    25                                 x1 = int(float(result[2 + j * 6 + 2]) * width)
  26.    26                                 y1 = int(float(result[2 + j * 6 + 3]) * height)
  27.    27                                 x2 = int(float(result[2 + j * 6 + 4]) * width)
  28.    28                                 y2 = int(float(result[2 + j * 6 + 5]) * height)
  29.    29                                 cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 1)
  30.    30                                 x_center = (float(result[2 + j * 6 + 2]) + float(result[2 + j * 6 + 4])) / 2
  31.    31                                 y_center = (float(result[2 + j * 6 + 3]) + float(result[2 + j * 6 + 5])) / 2
  32.    32                                 x_angle = int((x_center - 0.5) * 40 / 0.5)
  33.    33                                 y_angle = int((y_center - 0.5) * 40 / 0.5)
  34.    34                                 self.servo_cmd['x_dir'] = 'left' if x_angle <= 0 else 'right'
  35.    35                                 self.servo_cmd['x_angle'] = abs(x_angle)
  36.    36                                
  37.    37                         cv2.cvtColor(img, cv2.COLOR_BGR2RGB, img)
  38.    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.    39                         ServoControl('x', self.servo_cmd['x_dir'], self.servo_cmd['x_angle'])
  40.    40                    
  41.    41                     self.image = QImage(img.data, width, height, bytesPerLine, QImage.Format_RGB888)
  42.    42                     self.label_frame.setPixmap(QPixmap.fromImage(self.image).scaled(self.label_frame.width(), self.label_frame.height()))
  43.    43           
  44.    44                 
复制代码


裴家锋 2020-10-8 20:51:52
代码还有吗?那个网站下不了了
1回复

举报

郑信 2020-10-9 22:10:58
各位好,网盘的链接在这里:https://pan.baidu.com/s/188AylEd2QgOiA6YFv01N3A 提取码:e2og
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表