运动检测项目(两帧图片进行差分)

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值