Files
tools/move_warn/t2.py
flt6 3356e36e73 up
Former-commit-id: 3beec1f80e66a86223b0f0f5c98a1e1405a90a29
Former-commit-id: 39d11dd75ed5b66095bb2603c54ca790236af6af
2022-10-07 13:39:52 +08:00

98 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import cv2
import numpy as np
from winsound import PlaySound,SND_ALIAS,SND_ASYNC
from time import time
# Beep(500,500)
# camera = cv2.VideoCapture(0) # 参数0表示第一个摄像头
# camera = cv2.VideoCapture("opt.flv")
camera = cv2.VideoCapture("http://192.168.124.17:8081/live.flv")
# 判断视频是否打开
if (camera.isOpened()):
print('Open')
else:
print('摄像头未打开')
# 测试用,查看视频size
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)), int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('size:'+repr(size))
es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 4))
kernel = np.ones((5, 5), np.uint8)
background = None
cnt = 0
tot = 0
last = time()
mask = np.array([(0, 0),(282, 0),(282, 26),(0, 26)])
# cv2.waitKey(5)
while True:
# 读取视频流
try:
grabbed, frame_lwpCV = camera.read()
cv2.waitKey(5)
cv2.fillConvexPoly(frame_lwpCV, mask,(0,255,0))
cv2.imshow("src",frame_lwpCV)
except cv2.error:
print("ignore this frame")
continue
# 对帧进行预处理,先转灰度图,再进行高斯滤波。
# 用高斯滤波进行模糊处理,进行处理的原因:每个输入的视频都会因自然震动、光照变化或者摄像头本身等原因而产生噪声。对噪声进行平滑是为了避免在运动和跟踪时将其检测出来。
gray_lwpCV = cv2.cvtColor(frame_lwpCV, cv2.COLOR_BGR2GRAY)
gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0)
# 将第一帧设置为整个输入的背景
if background is None:
background = gray_lwpCV
continue
# 对于每个从背景之后读取的帧都会计算其与北京之间的差异并得到一个差分图different map
# 还需要应用阈值来得到一幅黑白图像并通过下面代码来膨胀dilate图像从而对孔hole和缺陷imperfection进行归一化处理
diff = cv2.absdiff(background, gray_lwpCV)
# cv2.imshow('abs', diff)
diff = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1] # 二值化阈值处理
diff = cv2.dilate(diff, es, iterations=2) # 形态学膨胀
# 显示矩形框
contours, hierarchy = cv2.findContours(diff.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 该函数计算一幅图像中目标的轮廓
contours = [c for c in contours if cv2.contourArea(c) >= 1500]
# 对于矩形区域,只显示大于给定阈值的轮廓,所以一些微小的变化不会显示。对于光照不变和噪声低的摄像头可不设定轮廓最小尺寸的阈值
total=0
for c in contours:
# if cv2.contourArea(c) < 1500:
# continue
total += cv2.contourArea(c)
(x, y, w, h) = cv2.boundingRect(c) # 该函数计算矩形的边界框
cv2.rectangle(frame_lwpCV, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('contours', frame_lwpCV)
cv2.imshow('dis', diff)
if len(contours)>0 and total>10000:
cnt+=1
if cnt > 5:
if time()-last<5:
print(time(),last)
tot+=1
else:
print("else: ",time(),last)
tot = 1
last = time()
cnt = 0
print("################################")
PlaySound("SystemAsterisk",SND_ALIAS|SND_ASYNC)
background = gray_lwpCV
else:
cnt=cnt-1 if cnt>0 else 0
if tot>4:
PlaySound("SystemHand",SND_ALIAS)
exit()
key = cv2.waitKey(1) & 0xFF
# 按'L'健退出循环
if key == ord('L'):
break
camera.release()
cv2.destroyAllWindows()