照着一个示例跑,目标本是捕获进入摄像头的第一帧然后会一直追踪这一个物体,如果出现的话会框出来,但是不知道什么原因,第一个框出来之后移动到别的地方还是会框别的东西,然后摄像头打开几秒就自动停止了还报错
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import pandas
firstframe = none
status = [none,none]
df = pandas.dataframe(columns = [ "start" , "end" ])
cap = cv2.videocapture( 1 )
while true:
check,colorframe = cap.read()
status = 0
gray = cv2.cvtcolor(colorframe,cv2.color_bgr2gray)
gray = cv2.gaussianblur(gray,( 21 , 21 ), 0 ) #高斯模糊去除噪声
if firstframe is none:
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)
for contours in cnts :
if cv2.contourarea(contours) < 10000 :
continue
if cv2.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 )
if key = = ord ( 'q' ):
break
|
显然这里有什么问题。
留待解决:高斯平滑参数的获取
到此这篇关于python和opencv构建运动检测器的实现的文章就介绍到这了,更多相关python opencv构建运动检测器内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/qq_41358574/article/details/114243010