python和opencv构建运动检测器的实现
照着一个示例跑,目标本是捕获进入摄像头的第一帧然后会一直追踪这一个物体,如果出现的话会框出来,但是不知道什么原因,第一个框出来之后移动到别的地方还是会框别的东西,然后摄像头打开几秒就自动停止了还报错
importpandas firstframe=None status=[None,None] df=pandas.DataFrame(columns=["start","end"]) cap=cv2.VideoCapture(1) whileTrue: check,colorframe=cap.read() status=0 gray=cv2.cvtColor(colorframe,cv2.COLOR_BGR2GRAY) gray=cv2.GaussianBlur(gray,(21,21),0)#高斯模糊去除噪声 iffirstframeisNone: firstframe=gray continue#捕获第一个灰度帧得到第一帧后不进行后续处理 delta_frame=cv2.absdiff(firstframe,gray) #,我们需要找出第一帧和当前帧之间的区别。因此,我们使用absdiff函数并将得到的结果称为delta帧。对于我们的用例来说,仅仅找到一个差异是不够的,所以我们需要定义一个像素阈值,它可以被视为真实的对象。我们可以选择30像素作为标准阈值,并将标准阈值的颜色定义为白色(颜色代码:255).二元阈值函数THRESH_BINARY返回一个元组值,其中只有第二项([0]是第一项,[1]是第二项)包含生成的阈值帧。二元阈值函数用于处理含有2个离散值的非连续函数:如0或1。如果摄影机前面没有对象,我们将当前帧的状态视为0;如果摄影机前面存在对象,则将当前帧的状态视为1。 thresh_frame=cv2.threshold(delta_frame,30,255,cv2.THRESH_BINARY)[1] thresh_frame=cv2.dilate(thresh_frame,None,iterations=3) #在膨胀函数Dilate中,我们可以通过设置迭代次数来设置平滑度。迭代次数越多,平滑度越高,处理时间也就越长。因此,建议保持标准化设置为3。膨胀函数中的“None”参数表示我们的应用中不需要元素结构。 #声明元组的语法(cnts,_) (cnts,_)=cv2.findContours(thresh_frame.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) forcontoursincnts: ifcv2.contourArea(contours)<10000: continue ifcv2.contourArea(contours)<20000: status=1 (x,y,w,h)=cv2.boundingRect(contours) cv2.rectangle(colorframe,(x,y),(x+w,y+h),(0,0,255),3) cv2.imshow("cc",colorframe) key=cv2.waitKey(1) ifkey==ord('q'): break
显然这里有什么问题。
留待解决:高斯平滑参数的获取
到此这篇关于python和opencv构建运动检测器的实现的文章就介绍到这了,更多相关pythonopencv构建运动检测器内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。