首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python-opencv人脸识别与树莓派摄像头转头跟随()

python-opencv人脸识别与树莓派摄像头转头跟随()

作者头像
十四君
发布2019-11-28 18:58:57
1.4K0
发布2019-11-28 18:58:57
举报
文章被收录于专栏:UrlteamUrlteam

代码发布在github中https://github.com/luyishisi/The_python_code.git文件夹是face-gensui

简述:使用python-subprocess多线程模块相链接,本项目主要用在树莓派上所以需要调用的摄像头函数与普通usb不同,so,有点差别但是不是很难。所使用文本文件进行数据沟通,简单粗暴,文件2.py功能是将目录下的5.jpg进行人脸识别解析,将人脸的位置的重心存储在文件weizhi.txt文件中,然后就比较相对位置的差别,就能得出应该与移动的位置。

本项目还未链接舵机用于转头,仅处理计算人脸信息,将每次的重心存储在文件中,方便未来进行增加舵机改进成为实际的转头。

  1.  使用指南,
  2.  请先安装好环境:
  3.  linux
  4.  python 2.7.3
  5.  opencv 2.3.1-7
  6.  安装依赖
  7.  sudo apt-get install libopencv-*
  8.  sudo apt-get install python-opencv
  9.  sudo apt-get install python-numpy
  10. 进入start运行2.py可以单独测试人脸识别的功能,欲测试整体不断识别相对位置功能请运行lianxuzhibo.py文件 python lianxuzhibo.py,如果环境上没有大问题的话应该能在该目录下出现5.jpg图片文件,如果存在人脸,则会进行识别,建立一个weizhi.txt文件,存储每次人脸位置的重心,

首先核心代码是opencv-face识别,请看start目录下的2.py

#coding=utf-8
import cv2
import cv2.cv as cv
 
img = cv2.imread("5.jpg")
 
def detect(img, cascade):
    '''detectMultiScale函数中smallImg表示的是要检测的输入图像为smallImg,
faces表示检测到的人脸目标序列,1.3表示每次图像尺寸减小的比例为1.3,
 4表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
 CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,Size(20, 20)为目标的最小最大尺寸'''
    rects = cascade.detectMultiScale(img, scaleFactor=1.3,
                                    minNeighbors=5, minSize=(30, 30), flags = cv.CV_HAAR_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    print rects
    rects[:,2:] += rects[:,:2]
    print rects
    return rects
 
#在img上绘制矩形
def draw_rects(img, rects, color):
    for x1, y1, x2, y2 in rects:
        cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
 
 
#转换为灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#直方图均衡处理
gray = cv2.equalizeHist(gray)
 
#脸部特征分类地址,里面还有其他
cascade_fn = '/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml'
 
#读取分类器,CascadeClassifier下面有一个detectMultiScale方法来得到矩形
cascade = cv2.CascadeClassifier(cascade_fn)
  
#通过分类器得到rects
rects = detect(gray, cascade)
 
#vis为img副本
'''
以下文件操作部分可以删除,功能只是要读取上一次的人脸位置重心
'''
vis = img.copy()
txt = str(rects)
fileHandle = open ( 'weizhi.txt', 'r' )
begin = fileHandle.read()
fileHandle.close()
 
fileHandle = open ( 'weizhi.txt', 'w' )
fileHandle.write(txt)
fileHandle.close()
 
x =int(begin[2:5:]) 
y =int(begin[6:9:])
z =int(begin[10:13])/2
x = x + z 
y = y + z 
print("x=",x,"y=",y,"z=",z)
f = open('zhongxin.txt','w')
f.write(str(x)+" "+str(y)+" "+str(z))
f.close()
 
#画矩形
draw_rects(vis, rects, (0, 255, 0))
 
cv2.imshow('facedetect', vis)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

其次还需要通过subprocess调用raspistll来不断创建新的当前画面并在当期目录下建立5.jpg文件 lianxuzhibo.py

import subprocess
import time
 
file_number = 0
 
while True:
    file_name = dir + format(file_number,"05d")+".jpg"
    file_number = file_number + 1
    subprocess.call(["raspistill","-w","400","-h","400","-e","jpg","-n","-t","1","-o",file_name])
    subprocess.call(["cp","-f",file_name,"5.jpg"])
    subprocess.call(["python","2.py"])
    time.sleep(1)import subprocess import time  file_number = 0  while True:     file_name = dir + format(file_number,"05d")+".jpg"     file_number = file_number + 1     subprocess.call(["raspistill","-w","400","-h","400","-e","jpg","-n","-t","1","-o",file_name])     subprocess.call(["cp","-f",file_name,"5.jpg"])     subprocess.call(["python","2.py"])     time.sleep(1)

连续直播的思路很明确不过是一直调用raspistll来获取摄像头当前的图片而已,最后一个time。sleep(1)是为了避免文件读取冲突。毕竟多线程。速度快,但是隐患也是有的。

上个效果图

未命名
未命名

原创文章,转载请注明: 转载自URl-team

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-02-102,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档