运动检测——帧间差分法的实现 by python and opencv

帧间差分法是通过比较两帧之间的像素差来确定运动的物体,是一种常用的运动检测方法。如果物体是运动的,那么在视频中两帧之间其所在位置的像素是不一样的,我们只需要求出两帧之间的像素差,并设定一个阈值,就能轻易地检测出视频中运动的物体。其具体步骤为:
1、读取视频
2、选取两帧
3、灰度化
4、滤波
5、帧间做差
6、二值化
7、形态学操作

其中,opencv中的absdiff可以轻易实现求两幅灰度图像的差值图像。
https://blog.csdn.net/tezhongjunxue/article/details/14492101
等许多博主的文章思想是通过对视频帧数的提取来实现帧间差分法,但在此处,我使用一种更加有趣的方法来实现帧间差分法:使用 cv.waitKey

具体代码如下,由于是使用的mp4格式,每两帧之间的时间差为33ms,waitKey(660)表示间隔20帧

def absdiff_demo(image_1, image_2, sThre):
    gray_image_1 = cv.cvtColor(image_1, cv.COLOR_BGR2GRAY)  #灰度化
    gray_image_1 = cv.GaussianBlur(gray_image_1, (3, 3), 0)  #高斯滤波
    gray_image_2 = cv.cvtColor(image_2, cv.COLOR_BGR2GRAY)
    gray_image_2 = cv.GaussianBlur(gray_image_2, (3, 3), 0)
    d_frame = cv.absdiff(gray_image_1, gray_image_2)
    ret, d_frame = cv.threshold(d_frame, sThre, 255, cv.THRESH_BINARY)
    return d_frame


capture = cv.VideoCapture("C:\\Users\\xxx\\Desktop\\2.mp4")
sThre = 5 #sThre表示像素阈值
i = 0
while(True):
    ret, frame = capture.read()
    if i == 0:
        cv.waitKey(660)
        i = i + 1
    ret_2, frame_2 = capture.read()
    d_frame = absdiff_demo(frame, frame_2, sThre)

你可能感兴趣的:(运动检测——帧间差分法的实现 by python and opencv)