这是什么呢?
当检测到有运动物体的时候,neo会实时的在视频流显示框中圈定画上绿色方框。
我的这个设置的比较灵敏,图像处理方面不算很精细,一点光线变化也会导致opencv感应。
有什么用呢?我平时不在家,tk1都是常开监控的,如果有什么物体移动,就会将图片记录下来,并利用威信公众号发送到我的微信上。当然,现在我们先看看opencv简单的运动检测能不能在neo上运行。
import argparse
import date
time
import imutils
import time
import cv2
import cv2.cv as cv
import numpy as np
#import gpio
#gpio.setup(57,"out"
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", help="path to the video file")
ap.add_argument("-a", "--min-area", type=int, default=300, help="minimum area size")
args = vars(ap.parse_args())
if args.get("video", None) is None:
camera = cv2.VideoCapture(0)
time.sleep(1)
# 读取视频文件
else:
camera = cv2.VideoCapture(args["video"])
firstFrame = None
#设定视频格式
fourcc = cv.CV_FOURCC('X', 'V', 'I', 'D')
framecount = 0
frame = np.zeros((640,480))
#out = cv2.VideoWriter('calm_down_video_'+datetime.datetime.now().strftime("%A_%d_%B_%Y_%I_%M_%S%p")+'.avi',fourcc, 5.0, np.shape(frame)
tc = 40
while tc:
ret, frame = camera.read()
#out.write(frame)
#cv2.imshow("vw",frame)
cv2.waitKey(10)
tc -= 1
totalc = 2000
tc = totalc
#out.release()
# 循环
while True:
#读取帧
(grabbed, frame) = camera.read()
text = "clear!"
#gpio.set(57,0)
if not grabbed:
time.sleep(1)
continue
# 改变大小
frame = imutils.resize(frame, width=500)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
# 高斯模糊
if tc%totalc == 0:
firstFrame = gray
tc = (tc+1) % totalc
continue
else:
tc = (tc+1) % totalc
frameDelta = cv2.absdiff(firstFrame, gray)#差值计算
thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1])#二值化图像
thresh = cv2.dilate(thresh, None, iterations=2)#膨胀图像
(cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#查找区域
# 循环画框
for c in cnts:
# 如果小于设定参数则放弃抓取
if cv2.contourArea(c) < args["min_area"]:
continue
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
text = "Alien inside!"
#gpio.set(57,1)
print text
# 写字符,由于编码问题,直接英文
cv2.putText(frame, "I`m working....: {}".format(text), (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
cv2.putText(frame, datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"), (10, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
# 显示视频,循环中不要加入耗时操作,否则视频流会卡顿变慢
cv2.imshow("Security Feed", frame)
cv2.imshow("Thresh", thresh)
cv2.imshow("Frame Delta", frameDelta)
if text == "Alien inside!":
if framecount == 0:
# 可以使用参数选择是否录制视频
#out = cv2.VideoWriter(datetime.datetime.now().strftime("%A_%d_%B_%Y_%I_%M_%S%p")+'.avi',fourcc, 10.0, np.shape(gray)[::-1])
#cv2.imwrite(datetime.datetime.now().strftime("%A_%d_%B_%Y_%I_%M_%S%p")+'.jpg',frame)
#out.write(frame)
framecount += 1
else:
#out.write(frame)
framecount += 1
elif framecount > 20 or framecount<2:
#out.release()
framecount = 0
key = cv2.waitKey(1) & 0xFF
# 按ESC停止
if key == 27:
break
cv2.imwrite("catchit.jpg",frame)#保存图像
camera.release()#释放摄像头,每次使用都要释放
cv2.destroyAllWindows()
可以看到,我使用了gpio库,我在tk1的57脚上装了个二极管,当检测到运动时灯亮。但tk1可以实时看到图像,所以我注销掉它免得占用opencv线程造成卡顿。这个gpio库完全基于IO,速度是很慢的。
有了这些,我们只需要一台联网的neo与摄像头,就可以做一个家庭智能监控器,当检测到有运动物体可以报警,也可以利用gpio做防御性的操作。微信的代码后面再提供,咱一步一步来。后面有考虑发点手势密码,人脸识别(基于深度学习)的代码,可以实现丢掉钥匙,一个摄像头就能看守家门,站在门前露个脸,识别5官特征,打个手势就能开门。