树莓派摄像头实时监控,树莓派实现目标检测
内容一:在草莓派上安装OpenCv1,在Python2上安装OpenCV2,在草莓派上安装在Python3上运行OpenCV2,检测移动对象源代码。
一、安装OpenCv
物体检测需要opencv函数库,opencv函数库具有丰富而强大的图像处理功能。
1.在草莓派上安装运行在Python2上的opencvsudoapt-getinstallbopencv-devsudoapt-getinstallpthon-opencv。当出现下图的结果时,意味着Python2环境下的opencv安装成功。
2.在草莓派上安装Python3上运行的OpenCV安装对应的依赖包。(注意倒数第二个命令将安装四个开发包。)。
sudo apt-getinstallbuild-essentialgitcmakepkg-config-ysudoapt-getinstalllibjpeg 8-dev-ysudoapt-getinstalllibtiff 12-dev-ysudoapt-getinstallavcodec-de vlibavformat-devlibswscale-dev libs allibgtk 2.0-dev-ysudoapt-getinstallinstallivcod
Sudo pip 3操作系统安装-python测试
在终端上输入:python3。
然后,导入cv2
如果安装成功,导入没有问题
可以输出OpenCv的版本号。
使用:打印(cv2.version))
使用python: exit())
2.运动目标检测运动目标检测的本质是轮廓检测。常用的运动目标检测算法有帧差法、光流法和背景差分法。
1.帧差法
帧差法是运动目标检测中常用的方法之一。基本原理很简单。首先计算相减前后两帧的像素差,用固定闭合值二值化得到前景运动目标。如果目标不动,两帧相减的像素差为零。如果目标有明显的运动,并且两帧相减后的像素差大于闭合值,则可以通过二值化得到运动目标在视频帧中的位置。
2.光流法
光流法的优点是不需要对场景背景建模就可以检测出运动物体,所以光流法常用于检测动态场景中的运动物体。然而,光流法是基于亮度守恒的假设。在复杂的自然场景中,由于遮挡、多光源、透明、噪声等原因,光流的可靠性较低,获得的运动信息误差较大。
3.背景扣除法
背景去除法是一种有效的运动目标检测算法。基本思想是利用背景的参数模型逼近背景图像的像素值,通过比较当前帧与背景图像的差异来检测运动区域。这里,差异大的像素区域被用作移动区域,差异小的像素区域被用作背景区域。背景去除方法需要背景图像,并且背景图像需要随着光照和外界环境的变化而实时更新,因此背景去除方法的关键是背景建模及其更新。
这里只具体介绍帧差法。其他请自行学习。
基本步骤
相邻帧相减-阈值处理-去噪-蚀刻滤波-扩展连通性-轮廓搜索-外接矩形。
首先导入视频或摄像机。
#视频文件输入初始化filename=/home/pi/desktop/python code/MP4/video . MP4 # camera=cv2 . video capture(filename)卡
fourcc=cv2 . video writer _ fourcc( x , v , I , d )# cv2 . video writer _ fourcc out 1=cv2 . video writer()/home/pi/desktop/python code/MP4/video返回的视频格式的唯一代码第三个是这个视频的fps。第四,一个元组就是这个视频的宽度和高度。
更改帧大小:
# Transform frame=cv2 . resize(frame,(800,400),interpolation=cv2。INTER_CUBIC)转换成灰度图像,并检测轮廓。
#结果转换成灰度gray_pic=cv2.cvtcolor(frame,cv2。COLOR_BGR2GRAY)),受伤的小懒虫被过滤模糊。
/p gray _ pic=cv2。Gaussian blur (gray _ pic,(21,21),0)将两幅图像之间的差值的绝对值输出到另一幅图像:
Delta=CV2。ABS Diff (last frame,gray _ pic)图像二值化,寻找轮廓的图像只能传入二值图像,不能传入灰度图像:
thresh=cv2 . threshold(frame delta,25,255,cv2.thresh _ binary) [1]获取轮廓位置:
Cnts,hierarchy=cv2 . find contexts(thresh . copy(),cv2.retr _ external,cv2.chain _ approximate _ simple)参数:
1要查找其轮廓的图像只能作为二进制图像传入,而不能作为灰度图像传入。
2大纲有四种检索模式:
2.cv2。RETR _外部表示只检测外部轮廓。
2.cv2检测到的轮廓。RETR列表不建立等级关系。
2.cv2。RETR_CCOMP建立两级等高线,上层是外边界,内层是内孔的边界信息。如果内孔中有另一个连接的对象,则该对象的边界也在顶层。
2.cv2。RETR树建立了分层树形结构的轮廓
3等高线的近似方法
2.CVChain _ Proxy _ None存储所有轮廓点,相邻两点的像素位置差小于1,即max(abs(x1-x2),abs(y2-y1))==1。
2.Chain _ Proxy _ Simple压缩水平、垂直和对角线方向的元素,只保留该方向的端点坐标。例如,一个矩形轮廓只需要4个点来保存轮廓信息。
按键结束:
#如果按下Q键,跳出循环ifcv 2 . wait key(30)0x ff==ord( Q ):break wait key()函数的作用是连续刷新图像,延迟的频率和时间,单位为ms。
返回值是当前的键盘键值。
wait key()在给定的时间内(以毫秒为单位)等待用户的键被触发;如果用户不按键,继续等待(循环)。
Common:设置waitKey(0)意味着程序将无限期地等待用户的按键事件。
一般来说,在执行imgshow时,如果设置了waitKey(0),则意味着当按下任意键继续显示视频时,需要将延迟时间设置为大于0的参数。
Delay 0,delay“delay”ms,这个功能在显示视频时很有用,
用于设置程序在显示一帧图像后等待“延时”毫秒显示下一帧视频;
如果使用waitKey(0),则只显示第一帧视频源代码#导入必要的软件包导入cv2#视频文件输入初始化filename=/home/pi/desktop/python code/MP4/Video . MP4 # camera=CV2 . Video capture(filename)#如果是摄像机,camera=cv2。VideoCapture(0) #0表示默认摄像头#视频文件输出参数设置out_fps=30.0 #输出文件帧率fourcc=cv2 . video writer _ fourcc( x , v , I ,D )# cv2 . video writer _ fourcc out 1=cv2 . video writer(/home/pi/desktop/python code/MP4/video 2 . MP4 ,fourcc,out_fps,(800,40)) #最后,视频宽度和高度out2=cv2。 00)) #初始化当前帧的上一帧lastFrame=None#遍历视频的每一帧同时camera.isOpened(): #读取下一帧(ret,frame)=camera.read() #如果抓不到一帧,说明我们已经到了视频的末尾如果没有ret: break #调整帧的大小frame=cv2.resize (frame,(800,400),inter _ cubic) #结果是一个灰度图像gray_pic=cv2.cvtColor(frame color _ bgr2gray) gray _ pic=cv2。Gaussian blur (gray _ pic,(21,21),0) #如果第一帧为none,如果最后一帧为None则初始化:last frame=gray _ piccontinue #计算当前帧与前一帧的差值,将两幅图像差值的绝对值输出到另一幅图像到frame delta=cv2 . ABS diff(last frame,Gray_pic) #当前帧设置为下一帧的前一帧。lastFrame=gray_pic #图像二值化thresh=cv2 . threshold(frame delta,25,255,cv2.thresh _ binary) [1] #去除图像噪声,先腐蚀后膨胀(形态学开运算)thresh=cv2.erode (thresh,none,iterations=1)thresh=cv2 . expand(thresh,none,iterations=2) #阈值图像上的轮廓位置,在cv3中,这个函数只有三个# cv2.chain _ approximate _ simple返回值,压缩垂直、水平和对角线方向,只留下CVChain _ Proxy _ Simple) #遍历cnts中c的轮廓:#忽略小轮廓,消除错误如果CV2。轮廓区域(C) 300: continue #计算轮廓的包围盒并在当前帧中画出包围盒(x,y,w,H)=cv2 . bounding rect(C)cv2 . rectangle(Frame,(x,y),(x w,y h),(0,255,0),2) #显示当前帧cv2.imshow (frame ,Frame)cv2 . im Show( Frame delta)Frame)cv2 . im Show( thresh ,thresh) #保存视频out1.write (frame) out2.write
利用摄像头实现人体活动检测(python openCV)
运动目标检测(2)-帧差法