首页 > 编程知识 正文

树莓派摄像头测试,树莓派实时目标检测

时间:2023-05-06 07:22:34 阅读:185735 作者:3557

文章目录1、安装OpenCv1、在Python2上运行的OpenCV2安装在草莓派上、在Python3上运行的OpenCV2安装在草莓派上、运动目标检测源代码

一.安装OpenCv

运动物体检测需要opencv函数库,有丰富强大的图像处理函数。

1、在草莓派上安装Python2上运行的opencvsudoapt-getinstallibopencv-devsudoapt-getinstallpython-opencv。 出现下图的结果时,表示Python2环境下的opencv安装成功。

2、在草莓派上安装与在Python3上运行的OpenCV安装相对应的依赖包。 (请注意,倒数第三个命令将安装四个-dev软件包。)。

sudo apt-getinstallbuild-essentialgitcmakepkg-config-ysudoapt-getinstalllibjpeg8- dev-ysudoapt-getinstalllibtiff 12-dev-ysudoapt-getinstallibavcodec-devlibavformat-devlibswscale-dev libs allibgtk 2.0-dev-ysudoapt-getinstallinstallivcod

sudo pip 3安装操作系统- python测试

在终端上输入: python3

然后,导入cv2

如果安装成功,import没有问题

可以输出OpenCv的版本号

使用: print(cv2.version ) )

python用:退出() )

二、运动目标检测运动目标检测的本质是轮廓检测。 常用的运动目标检测算法有帧差分法、光流法和背景减法。

1、帧差分法

帧差分法是运动目标检测中常见的方法之一。 其基本原理非常简单,首先计算前后两帧减法的像素差,利用固定闭值进行二值化处理,得到前景运动目标。 如果目标没有移动,则两帧减法的像素差为零。 如果目标有明显的运动,两帧相减后的像素差值大于闭合值,二值化处理可以得到视频帧内运动目标的位置。

2、光流法

光流方法的优点是可以在不建模场景背景的情况下检测运动目标,因此动态场景中多采用光流方法检测运动目标。 然而,光流方法基于亮度守恒假设条件,在复杂的自然场景中,由于遮挡性、多光源、透明度、噪声等原因,光流可靠性低,获得的运动信息误差大。

3 .背景减少法

背景去除法是一种有效的运动物体检测算法,基本思路是利用背景的参数模型逼近背景图像的像素值,通过对当前帧和背景图像的差分比较实现运动区域的检测。 这里,以差分大的像素区域作为运动区域,以差分小的像素区域作为背景区域。 背景去除法需要背景图像,且背景图像需要随着光照和外部环境的变化而实时更新,因此背景去除法的关键是背景建模及其更新。

这里只具体介绍帧差分法。 其他的请自己学习。

基本步骤

相邻帧减法--- -阈值处理--- -去噪-----蚀刻滤波器--- -膨胀连通--- -轮廓搜索---外接矩形

首先导入视频或摄像机

#视频文件输入初始化filename='/home/pi/desktop/python代码/MP4/video.MP4 ' # camera=cv2.video capture (filename )卡

fourcc=cv2.video writer _ fourcc (' x ',' v ',' I ', ' d ' ) #cv2.VideoWriter_fourcc返回的视频格式唯一代码out1=cv2.videowriter ()/home/pi/desktop/python代码/MP4/video 第三个是这个视频的fps。 第四个,一个tuple是这个视频的宽度、高度。

更改框架大小:

#将变更该帧大小的帧=cv2.resize (帧,(800,400 ),interpolation=cv2.INTER_CUBIC )变换为灰度图像,检测轮廓

#结果,转换为灰度gray_pic=cv2.cvtcolor(frame,cv2.COLOR_BGR2GRAY ) )进行受伤小懒汉滤波模糊处理对受伤小懒汉进行模糊处理

/p> gray_pic = cv2.GaussianBlur(gray_pic,(21, 21),0)

把两幅图的差的绝对值输出到另一幅图上面来:

frameDelta = cv2.absdiff(lastFrame, gray_pic)

图像二值化,要寻找轮廓的图像 只能传入二值图像,不是灰度图像:

thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]

获取轮廓位置:

cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

参数:
1 要寻找轮廓的图像 只能传入二值图像,不是灰度图像
2 轮廓的检索模式,有四种:
cv2.RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层
cv2.RETR_TREE建立一个等级树结构的轮廓
3 轮廓的近似办法
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

按键结束:

#如果q键被按下,跳出循环if cv2.waitKey(30) & 0xFF == ord('q'): break

waitKey() 函数的功能是不断刷新图像 , 频率时间为delay , 单位为ms
返回值为当前键盘按键值

waitKey()–是在一个给定的时间内(单位ms)等待用户按键触发; 如果用户没有按下键,则继续等待 (循环)
常见 : 设置 waitKey(0) , 则表示程序会无限制的等待用户的按键事件
一般在 imgshow 的时候 , 如果设置 waitKey(0) , 代表按任意键继续显示视频时,延迟时间需要设置为 大于0的参数
delay > 0时 , 延迟 ”delay”ms , 在显示视频时这个函数是有用的 ,
用于设置在显示完一帧图像后程序等待 ”delay”ms 再显示下一帧视频 ;
如果使用 waitKey(0) 则只会显示第一帧视频 源代码 # 导入必要的软件包import cv2# 视频文件输入初始化filename = "/home/pi/Desktop/python代码/MP4/video.mp4"#camera = cv2.VideoCapture(filename)#如果是摄像头的话camera = cv2.VideoCapture(0) #0表示默认摄像头# 视频文件输出参数设置out_fps = 30.0 # 输出文件的帧率fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') #cv2.VideoWriter_fourcc返回的视频制式特定代码out1 = cv2.VideoWriter('/home/pi/Desktop/python代码/MP4/video2.mp4', fourcc, out_fps, (800, 400))#最后是视频宽高out2 = cv2.VideoWriter('/home/pi/Desktop/python代码/MP4/video3.mp4', fourcc, out_fps, (800, 400))# 初始化当前帧的前帧lastFrame = None# 遍历视频的每一帧while camera.isOpened(): # 读取下一帧 (ret, frame) = camera.read() # 如果不能抓取到一帧,说明我们到了视频的结尾 if not ret: break # 调整该帧的大小 frame = cv2.resize(frame, (800, 400), interpolation=cv2.INTER_CUBIC)# 结果转为灰度图 gray_pic = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray_pic = cv2.GaussianBlur(gray_pic,(21, 21),0) # 如果第一帧是None,对其进行初始化 if lastFrame is None: lastFrame = gray_pic continue # 计算当前帧和前帧的不同,把两幅图的差的绝对值输出到另一幅图上面来 frameDelta = cv2.absdiff(lastFrame, gray_pic) # 当前帧设置为下一帧的前帧 lastFrame = gray_pic # 图像二值化 thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1] ''' #去除图像噪声,先腐蚀再膨胀(形态学开运算) thresh=cv2.erode(thresh,None,iterations=1) thresh = cv2.dilate(thresh, None, iterations=2) ''' # 阀值图像上的轮廓位置,在cv3中此函数的返回值才有三个 #cv2.CHAIN_APPROX_SIMPLE,压缩垂直、水平、对角方向,只保留端点 cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历轮廓 for c in cnts: # 忽略小轮廓,排除误差 if cv2.contourArea(c) < 300: continue # 计算轮廓的边界框,在当前帧中画出该框 (x, y, w, h) = cv2.boundingRect(c) cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # 显示当前帧 cv2.imshow("frame", frame) cv2.imshow("frameDelta", frameDelta) cv2.imshow("thresh", thresh) # 保存视频 out1.write(frame) out2.write(frameDelta) # 如果q键被按下,跳出循环 if cv2.waitKey(30) & 0xFF == ord('q'): break# 清理资源并关闭打开的窗口out1.release()out2.release()camera.release()cv2.destroyAllWindows()

参考连接:
利用摄像头实现人员活动检测(python+openCV)
运动目标检测(2)—帧间差分法

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。