import sys
import cv2
import numpy as np
import imutils
import datetime
def test_lingeman(): # 识别黑烟
camera = cv2.VideoCapture("")
ret2, img2 = camera.read()
frame1 = img2
# frame=cv2.imread("2.jpeg")
# prevframe = frame
prevframe4 = np.array(frame1)
cv2.namedWindow('result', 0)
cv2.resizeWindow('result', 800, 500)
prevframe3 = cv2.cvtColor(prevframe4, cv2.COLOR_RGB2GRAY) # 先取一帧
cap = cv2.VideoCapture("rtsp://admin:hn28099668@192.168.1.119:554/Streaming/Channels/102")
# 获取视频帧的宽和高
w = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# 获取视频总帧数和fps
count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
fps = cap.get(cv2.CAP_PROP_FPS)
# 视频保存
# fourcc = cv.VideoWriter_fourcc('P', 'I', 'M', '1')
# fourcc = cv.VideoWriter_fourcc(*'XVID')
# 视频编码格式
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
TimeS = datetime.datetime.now().strftime('%H%M%S%f')[0:7]
nowtime = datetime.datetime.now().strftime('%Y%m%d_' + TimeS) + '.mp4' # 视频文件名
nowtimejp = datetime.datetime.now().strftime('%Y%m%d_' + TimeS) + '.jpg' # 图片文件名
tempAviFilejp = 'D:/lzk/pythonProject3/HN_Data/' + nowtimejp # 保存图片的文件名
tempAviFile = 'D:/lzk/pythonProject3/HN_Data/'+nowtime # 保存的文件名
jis = 200
out = cv2.VideoWriter('D:/lzk/pythonProject3/HN_Data/'+nowtime, fourcc, fps,
(int(w), int(h)), True) # 保存一个视频
while camera.isOpened():
jis -= 1
ret, img = camera.read()
base = img
left_point_x = 0
right_point_x = 0
top_point_y = 0
bottom_point_y = 0
frame = np.array(img)
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
frame = cv2.blur(frame, (5, 5))
box = NULL
global prevframe2
nextframe = frame
diff = cv2.absdiff(prevframe3, nextframe)
ret4, thresh4 = cv2.threshold(diff, 40, 80, cv2.THRESH_BINARY)
# y, x = diff.shape[:-1]
# frame = QImage(diff, x, y, QImage.Format_RGB888)
# Ui_Dialog.setupUi.scene2.clear() # 先清空上次的残留
# self.pix = QPixmap.fromImage(frame)
# self.scene.addPixmap(self.pix)
k2 = np.ones((40, 40), np.uint8)
# a,b,c,d=cv2.MinMaxLoc(frame,mask)
# mean=cv2.Mean(frame,mask)
k = np.ones((40, 40), np.uint8)
opening = cv2.morphologyEx(thresh4, cv2.MORPH_OPEN, k) # 开运算
closing2 = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, k2)
cnts = cv2.findContours(closing2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
ret, labels, status, centroids = cv2.connectedComponentsWithStats(closing2, connectivity=8)
image_filtered = np.zeros_like(thresh4)
for (i, label) in enumerate(np.unique(labels)):
# 如果是背景,忽略
if label == 0:
continue
if status[i][-1] > 50:
image_filtered[labels == i] = 255
global mean
cnts = cv2.findContours(closing2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
mean = cv2.mean(prevframe3, image_filtered)
for i, c in enumerate(cnts):
# 找到边界坐标
x, y, w, h = cv2.boundingRect(c) # 计算点集最外面的矩形边界
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 找面积最小的矩形
rect = cv2.minAreaRect(c)
# 得到最小矩形的坐标
box = cv2.boxPoints(rect)
# 标准化坐标到整数
box = np.int0(box)
# 画出边界
cv2.drawContours(img, [box], 0, (0, 255, 0), 3)
left_point_x = np.min(box[:, 0])
right_point_x = np.max(box[:, 0])
top_point_y = np.min(box[:, 1])
bottom_point_y = np.max(box[:, 1])
# 计算最小封闭圆的中心和半径
mage_filtered = np.zeros_like(closing2)
if ([box] != NULL):
mage_filtered[left_point_x:right_point_x, top_point_y:bottom_point_y] = 255
global list
global mask
global picture
if (ret != False):
list.append(base)
mask.append(
mage_filtered)
else:
continue
out.write(img)
if jis == 0:
cv2.imwrite(tempAviFilejp, img)
cv2.imshow("result", img)
if cv2.waitKey(1) == ord('e'):
out.release()
camera.release()
break