import cv2 import numpy as np frames_list = [] chafen_frames_list = [] # 通过cv2中的类获取视频流操作对象cap cap = cv2.VideoCapture('rtsp://192.168.1.18:554/1/h264major') #此为摄像头URL,可以替换为本地视频路径;若设置为0(表示调用本地的摄像头) # 调用cv2方法获取cap的视频帧 fps = cap.get(cv2.CAP_PROP_FPS) # 获取cap视频流的每帧大小 size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) # 定义编码格式 fourcc = cv2.VideoWriter_fourcc('P', 'I', 'M', '1') # 定义视频文件输入对象 outVideo = cv2.VideoWriter('saveDir.avi', fourcc, fps, size) # 循环使用cv2的read()方法读取视频帧 while cap.isOpened(): rval, frame = cap.read()#读取每一帧的图像 height, width = frame.shape[0:2] # 取图片的高与宽 frames_list.append(frame)#把每一帧的图像存进列表里 i = len(frames_list)-1 if(i >=1): frame_front = frames_list[i-1] frame_later = frames_list[i] # #中值滤波 # frame_front = cv2.medianBlur(frame_front, 9) # frame_later = cv2.medianBlur(frame_later, 9) #得出差分图 chafen_frame = cv2.absdiff(frame_front, frame_later) # cv2.imshow('chafentu', chafen_frame) img_array1 = np.array(chafen_frame) huidu_max1 = img_array1.max() #转化为灰度图 chafen_frame = cv2.cvtColor(chafen_frame, cv2.COLOR_BGR2GRAY) #将图片分块 ndiv = 30 # ndiv分几个块,div每一个块有几个像素 div = height// ndiv ndiv2 = 30 div2 = width // ndiv2 #行分割 frame_result = chafen_frame[0:1,:] for i in range(ndiv): if i < (ndiv - 1): frame_temp = chafen_frame[i * div:(i + 1) * div,:] else: frame_temp = chafen_frame[(ndiv - 1) * div:height,:] #列分割 frame_temp_result = frame_temp[:,0:1] for j in range(ndiv2): if j < (ndiv2 - 1): frame_temp2 = frame_temp[:,j * div2:(j + 1) * div2] else: frame_temp2 = frame_temp[:,(ndiv2 - 1) * div2:width] img_array = np.array(frame_temp2) huidu_min = img_array.min() huidu_max = img_array.max() cha = huidu_max-huidu_min if (huidu_max<=float(huidu_max1/10) or cha <= 10): ret, frame_temp2 = cv2.threshold(frame_temp2, huidu_max+1, 255, cv2.THRESH_BINARY) else: ret, frame_temp2 = cv2.threshold(frame_temp2, float(huidu_max/2), 255, cv2.THRESH_BINARY) # ret, frame_temp2 = cv2.threshold(frame_temp2, 0, 255, cv2.THRESH_TRIANGLE) # ret, frame_temp2 = cv2.threshold(frame_temp2, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 二值化 # ret, frame_temp2 = cv2.threshold(frame_temp2, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # retVal, frame_temp2 = cv2.threshold(frame_temp2, 0, 255, cv2.THRESH_OTSU) # ret, frame_temp2 = cv2.threshold(frame_temp2, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 二值化 # frame_temp2 = cv2.adaptiveThreshold(frame_temp2, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 3, 5) # frame_temp2 = cv2.adaptiveThreshold(frame_temp2, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3) # frame_temp2 = cv2.adaptiveThreshold(frame_temp2, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 3) # frame_temp2 = cv2.adaptiveThreshold(frame_temp2, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 7, 4)#目前效果最好的一种自适应方法 # frame_temp2 = cv2.adaptiveThreshold(frame_temp2, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 27, 10) # ret, frame_temp2 = cv2.threshold(frame_temp2, 0, 255, cv2.THRESH_TRIANGLE) frame_temp_result = np.concatenate((frame_temp_result, frame_temp2), axis = 1) # 拼接 frame_temp_result = np.delete(frame_temp_result, 0, axis = 1) # 删除第一列 frame_result = np.concatenate((frame_result, frame_temp_result), axis=0) # 拼接 cv2.imshow('frame_result', frame_result) if(i>=500):#及时删除列表里面的数据 frames_list = [] cv2.imshow('frame',frame) outVideo.write(frame) cv2.waitKey(1) cap.release() outVideo.release() cv2.destroyAllWindows()
运动检测项目(两帧图片进行差分)
最新推荐文章于 2024-10-09 20:15:06 发布