超级版主
超级版主 Lv61    
楼主
使用OpenCV做人脸识别
查看:3735   回复:2   发布于2019-06-13 14:44:23
需要先下载已配置好opencv环境的raspbian镜像

下载链接: https://pan.baidu.com/s/12_1DYzvcvm-zPKhfHi5-Tw  提取码: 917t 


Image



一、OpenCV 简介    

        树莓派图像处理部分使用的开源计算机视觉环境 OpenCV。OpenCV 是 Open Source Computer Vision Library 的缩写,是一个基于开源发行的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法,已经成为计算机视觉领域最有力的研 究 工 具 之 一 。OpenCV的 底层由C和C++编 写 ,轻量且高 效 ,可以运行在多个操作系统上( L i n u x 、 Windows、Mac、Andorid、iOS 等),同时提供了多种编程语言的API 接口,本教程是基于Python的接口进行一些简单的计算机视觉处理。

        OpenCV 的应用领域:机器人视觉、模式识别、机器学习、工厂自动化生产线产品检测、 医学影像、摄像机标定、遥感图像等。

        OpenCV 可以解决的问题: 人机交互、机器人视觉、运动跟踪、图像分类、人脸识别、 物体识别、特征检测、视频分析、深度图像等

        但是我们也必须面对一个硬件材料上的事实,即,树莓派的自身性能运行高计算量的OpenCV项目是非常困难的,我们不得不考虑和优化延迟卡顿等问题。

        OpenCV 的实时性能也非常出色,可实时应用,为实时场景的视觉环境开发提供了很好 的解决方案,总之 OpenCV 是计算机视觉开发方面优秀的开源工具,如果对计算机视觉开发 感兴趣可以多了解这方面的知识:

OpenCV 官方主页:https://www.opencv.org

OpenCV 中文论坛:http://www.opencv.org.cn

OpenCV CSDN 论坛:https://bbs.csdn.net/forums/OpenCV

OpenCV CSDN 论坛:https://bbs.csdn.net/forums/OpenCV


二、OpenCV镜像系统的人脸识别测试


        由于opencv安装的教程比较繁琐,我这里就不介绍了,我们提供的是可以已经安装好的镜像。

需要的材料有:显示屏一个,树莓派一个,广角摄像头一个

接线图如下

Image
2. 测试代码

### Imports ###################################################################

from picamera.array import PiRGBArray

from picamera import PiCamera

from functools import partial

import multiprocessing as mp

import cv2

import os

import time

### Setup #####################################################################

os.putenv( 'SDL_FBDEV', '/dev/fb0' )

resX = 320

resY = 240

cx = resX / 2

cy = resY / 2

os.system( "echo 0=150 > /dev/servoblaster" )

os.system( "echo 1=150 > /dev/servoblaster" )

xdeg = 150

ydeg = 150

# Setup the camera

camera = PiCamera()

camera.resolution = ( resX, resY )

camera.framerate = 60

# Use this as our output

rawCapture = PiRGBArray( camera, size=( resX, resY ) )

# The face cascade file to be used

face_cascade = cv2.CascadeClassifier('/home/pi/opencv-3.4.1/data/lbpcascades/lbpcascade_frontalface.xml')

t_start = time.time()

fps = 0

### Helper Functions ##########################################################

def get_faces( img ):

    gray = cv2.cvtColor( img, cv2.COLOR_BGR2GRAY )

    faces = face_cascade.detectMultiScale( gray )

    return faces, img

def draw_frame( img, faces ):

    global xdeg

    global ydeg

    global fps

    global time_t

 

    # Draw a rectangle around every face

    for ( x, y, w, h ) in faces:

        cv2.rectangle( img, ( x, y ),( x + w, y + h ), ( 200, 255, 0 ), 2 )

        cv2.putText(img, "Face No." + str( len( faces ) ), ( x, y ), cv2.FONT_HERSHEY_SIMPLEX, 0.5, ( 0, 0, 255 ), 2 )

        tx = x + w/2

        ty = y + h/2

       if   ( cx - tx > 15 and xdeg <= 190 ):

            xdeg += 1

            os.system( "echo 0=" + str( xdeg ) + " > /dev/servoblaster" )

        elif ( cx - tx < -15 and xdeg >= 110 ):

            xdeg -= 1

            os.system( "echo 0=" + str( xdeg ) + " > /dev/servoblaster" )

        if   ( cy - ty > 15 and ydeg >= 110 ):

            ydeg -= 1

            os.system( "echo 1=" + str( ydeg ) + " > /dev/servoblaster" )

        elif ( cy - ty < -15 and ydeg <= 190 ):

            ydeg += 1

            os.system( "echo 1=" + str( ydeg ) + " > /dev/servoblaster" )

    # Calculate and show the FPS

    fps = fps + 1

    sfps = fps / (time.time() - t_start)

    cv2.putText(img, "FPS : " + str( int( sfps ) ), ( 10, 10 ), cv2.FONT_HERSHEY_SIMPLEX, 0.5, ( 0, 0, 255 ), 2 ) 

    cv2.imshow( "Frame", img )

    cv2.waitKey( 1 )

### Main ######################################################################

if __name__ == '__main__':

   pool = mp.Pool( processes=4 )

    fcount = 0

    camera.capture( rawCapture, format="bgr" )  

    r1 = pool.apply_async( get_faces, [ rawCapture.array ] )    

    r2 = pool.apply_async( get_faces, [ rawCapture.array ] )    

    r3 = pool.apply_async( get_faces, [ rawCapture.array ] )    

    r4 = pool.apply_async( get_faces, [ rawCapture.array ] )    

    f1, i1 = r1.get()

    f2, i2 = r2.get()

    f3, i3 = r3.get()

    f4, i4 = r4.get()

    rawCapture.truncate( 0 )    

    for frame in camera.capture_continuous( rawCapture, format="bgr", use_video_port=True ):

        image = frame.array

        if   fcount == 1:

            r1 = pool.apply_async( get_faces, [ image ] )

            f2, i2 = r2.get()

            draw_frame( i2, f2 )

        elif fcount == 2:

            r2 = pool.apply_async( get_faces, [ image ] )

            f3, i3 = r3.get()

            draw_frame( i3, f3 )

        elif fcount == 3:

            r3 = pool.apply_async( get_faces, [ image ] )

            f4, i4 = r4.get()

            draw_frame( i4, f4 )

        elif fcount == 4:

            r4 = pool.apply_async( get_faces, [ image ] )

            f1, i1 = r1.get()

            draw_frame( i1, f1 )
            fcount = 0
        fcount += 1
        rawCapture.truncate( 0 )

3. 代码上传到树莓派上

Image

Image

4. 运行代码(远程运行会失败)只能在树莓派上运行

Image

树莓派极客网Raspigeek.com 
回复列表
默认   热门   正序   倒序
kulkun110
3F
kulkun110Lv0 
佩服!!!!!
 1   2020-01-15 22:46:40 回复
tim0301
2F
tim0301Lv0 
很给力,自己也试试
 3   2019-09-25 17:07:38 回复

回复: 使用OpenCV做人脸识别

Powered by Raspigeek RASPIGEEK_VERSION

©2015 - 2020 树莓派极客论坛

官方网站 联系站长

您的IP:18.232.188.89,2020-07-15 00:38:05,Processed in 0.06011 second(s).