硬件:树莓派 B+
先安装python-opencv:
sudo apt-get install python-opencv
Python 2.7 OpenCV3.0
然后在树莓派usb端口插入一个通用的usb摄像头,看系统是否自动识别并已经安装驱动。
一般linux下免驱,如果没有驱动,可以更新update系统。
然后有两种方法检测摄像头是否被良好的正常驱动:
1. 在根目录下输入ls /dev,查看目录下是否存在video0这个设备。有则表示系统已识别。
2. 输入lsusb查看usb挂载设备;如下有1e4e那就是有摄像头了:
然后安装截图软件fswebcam进行摄像头测试,可配合web服务器实现图片监控;
apt-get install fswebcam
为实现自动拍照,可新建脚本cam.sh并chmod +x设置权限到最大,让系统自动执行。
然后加入cronjob使该脚本每分钟自动运行一次。
Cron 是UNIX,SOLARIS,LINUX下的一个十分有用的工具。通过Cron脚本能使计划任务定期地在系统后台自动运行。这种计划任务在UNIX,SOLARIS, LINUX下术语为cron jobs。
“crontab -e” 指令表示,编辑该用户的crontab,当指定crontab 不存在时新建。
*/1 * * * * /home/pi/cam.sh
加入上述语句表示每分钟执行一次。然后保存crontab即可看到图像更新。
web端效果:
然后准备用MPEGStreamer发布流媒体视频到本地网页,供查看:
分以下几个步骤:
1。 安装mjpeg库:sudo apt-get install libv4l-dev libjpeg8-dev imagemagick
2。 使用SVN从SourceForge上编译MPEGStreamer这个开源项目:
或者直接下载整套代码压缩包mjpg-streamer_svn_r182.tar.gz,自行编译;
之后把压缩包复制到/home/pi目录下:
cp mjpg-streamer_svn_r182.tar.gz /home/pi
解压该压缩包,到mjpg-streamer目录下:
tar zxvf mjpg-streamer_svn_r182.tar.gz
软连接现在的libjpeg8版本的库到libjpeg7依赖:
ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
最后进入源代码目录并编译:
编译完毕后即告成功!!!
功能测试,执行:
sudo ./mjpg_streamer -i “./input_uvc.so -d /dev/video0 -r 1280×720 -f 12” -o “./output_http.so -p 8090 -w ./www”
(-r后是分辨率参数,-f后面是帧率,请根据您的摄像头参数进行调整)
# -*- coding: utf-8 -*-
import cv2.cv as cv
import cv2
import numpy as np
from cv2 import VideoCapture
from video import create_capture
from common import clock,draw_str
#cv.NamedWindow("W1", cv.CV_WINDOW_AUTOSIZE)
cv2.namedWindow("W1")
#cv2.ResizeWindow("video", 600, 600)
capture = cv2.VideoCapture(0)
success,frame=capture.read()
color=(0,0,255)
classfier = cv2.CascadeClassifier("/home/opencv/data/haarcascades/haarcascade_eye.xml")
def repeat():
succes,frame = capture.read()
image_size =frame.shape[:2]
#print image_size
image = np.zeros(image_size, dtype=np.float16)
image = cv2.cvtColor(frame, cv2.cv.CV_BGR2GRAY)
hi,wi=image_size
minSize=(wi/8,hi/8)
image=cv2.equalizeHist(image)
#storage = cv2.CvMemStorage(0)
# cv2.rectangle(frame, (210, 0), (210, 480),(0,0,255))
cv2.line(frame, (210,0),(210,480), (0,255,255),1)
cv2.line(frame, (420,0),(420,480), (0,255,255),1)
cv2.line(frame, (0,160),(640,160), (0,255,255),1)
cv2.line(frame, (0,320),(640,320), (0,255,255),1)
# detect objects
# faces = cv.HaarDetectObjects(image, cascade, storage, 1.2,
# 2,cv.CV_HAAR_DO_CANNY_PRUNING,(100, 100))
faceRects = classfier.detectMultiScale(image, 1.2, 2,
cv2.CASCADE_SCALE_IMAGE, minSize)
for (x,y,w,h) in faceRects:
# print x,y
if x<210:
print "right"
elif x>310:
print "left"
cv2.rectangle(frame, (x,y), (x+w,y+h), (0,128,0))
# cv.ShowImage("W1", greyscale)
# cv.ShowImage("W1", frame)
cv2.imshow("W1",frame)
while True:
repeat()
c = cv2.waitKey(10)
c=chr(c & 255)
if c in['q','Q',chr(27)]:
#cv2.VideoCapture(0).release()
cv2.destroyWindow("W1")
break
该例程可以识别眼睛,在眼睛部位画上绿色的小框框,并把人脸的转移方向输出在树莓派终端。
如果需要脸部识别,那就把haarcascade_eye.xml改成haarcascade_frontalface_alt.xml就可以了
附:人脸识别.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# face_detect.py
# Face Detection using OpenCV. Based on sample code from:
# http://python.pastebin.com/m76db1d6b
# Usage: python face_detect.py <image_file>
import sys, os
from opencv.cv import *
from opencv.highgui import *
from PIL import Image, ImageDraw
from math import sqrt
def detectObjects(image):
"""Converts an image to grayscale and prints the locations of any faces found"""
grayscale = cvCreateImage(cvSize(image.width, image.height), 8, 1)
cvCvtColor(image, grayscale, CV_BGR2GRAY)
storage = cvCreateMemStorage(0)
cvClearMemStorage(storage)
cvEqualizeHist(grayscale, grayscale)
cascade = cvLoadHaarClassifierCascade(
'/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml',
cvSize(1,1))
faces = cvHaarDetectObjects(grayscale, cascade, storage, 1.1, 2,
CV_HAAR_DO_CANNY_PRUNING, cvSize(20,20))
result = []
for f in faces:
result.append((f.x, f.y, f.x+f.width, f.y+f.height))
return result
def grayscale(r, g, b):
return int(r * .3 + g * .59 + b * .11)
def process(infile, outfile):
image = cvLoadImage(infile);
if image:
faces = detectObjects(image)
im = Image.open(infile)
if faces:
draw = ImageDraw.Draw(im)
for f in faces:
draw.rectangle(f, outline=(255, 0, 255))
im.save(outfile, "JPEG", quality=100)
else:
print "Error: cannot detect faces on %s" % infile
if __name__ == "__main__":
process('input.jpg', 'output.jpg')