[经验] 【Nanopi NEO试用体验】【机器学习/计算机视觉/NLP高级篇】用opencv做动态监视器

[复制链接]

实习生

发表于 2016-11-9 20:52:18   1387 查看 2 回复 显示全部楼层 倒序浏览
分享
最近实在是太忙,一直没空折腾neo,因为我的工作其实与嵌入式八杆子打不着。
本来打算由浅入深,从opencv到ML,再到自然语言处理/音频处理的,但我的neo木有显示啊,这就难办了,mat无法显示,所以有些代码得先在我的tk1上调试,再迁移到neo上验证可行性。话说tk1自带CUDA,性能上,做开发足够了。但neo确实比较蛋疼,需要手动开核,否则跑深度学习,就只有一个核心工作,其他3个看热闹。关于这个,倒是有解决办法,于是我弄了pp模块下来,让tk1参与到同一个程序模块的并行计算中,实现2个板子运行同一程序。(其实用PC不是更好?但咱是玩嵌入式,先把PC丢一边,除非咱要训练超大模型,才有必要借助PC)
pp模块的代码实在是不好体现,再说跑opencv也不需要,所以代码都与pp无关,好了,闲话少说,上图说话。
catchit.jpg
这是什么呢?
当检测到有运动物体的时候,neo会实时的在视频流显示框中圈定画上绿色方框。
我的这个设置的比较灵敏,图像处理方面不算很精细,一点光线变化也会导致opencv感应。
有什么用呢?我平时不在家,tk1都是常开监控的,如果有什么物体移动,就会将图片记录下来,并利用威信公众号发送到我的微信上。当然,现在我们先看看opencv简单的运动检测能不能在neo上运行。
import argparse
import datetime
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官特征,打个手势就能开门。

标签:监视器

实习生

发表于 2017-2-18 20:21:32  
大神 膜拜中 最近刚拿到这个板子 这么强大的功能可以搞定嘛
回复

点赞 举报

实习生

发表于 2017-5-1 23:37:35  

PCB在线计价下单

板子大小:

cm
X
cm

层数:

2

板子数量:

10

厚度:

1.6
你这个是用什么开发的
回复

点赞 举报

只有小组成员才能发言,加入小组>>

37个成员聚集在这个小组

加入小组

创建小组步骤

关闭

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

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

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区