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