0x0

三帧法运动检测属于帧间差分法,相关介绍在之前的文章中有介绍。

这次使用Golang的OpenCV库:gocv 来编写,是最近为了练手gocv而写的第一个demo

0x1
package main

import (
    "gocv.io/x/gocv"
)

func main() {
    c, err := gocv.VideoCaptureFile("1.mp4")
    if err != nil {
        panic(err)
    }
    mat := gocv.NewMat()
    aMat, bMat := gocv.NewMat(), gocv.NewMat()
    ab, bc := gocv.NewMat(), gocv.NewMat()
    f := gocv.NewMat()
    w, err := gocv.VideoWriterFile("test.mp4", c.CodecString(), c.Get(gocv.VideoCaptureFPS), int(c.Get(gocv.VideoCaptureFrameWidth)), int(c.Get(gocv.VideoCaptureFrameHeight)), false)

    for c.Read(&mat) {
        //灰度
        gocv.CvtColor(mat, &mat, gocv.ColorBGRToGray)
        //二值
        gocv.Threshold(mat, &mat, 25, 255, gocv.ThresholdBinary)
        if bMat.Empty() {
            if aMat.Empty() {
                mat.CopyTo(&aMat)
            } else {
                mat.CopyTo(&bMat)
                gocv.AbsDiff(aMat, bMat, &ab)
            }
            continue
        }
        gocv.AbsDiff(bMat, mat, &bc)
        gocv.BitwiseAnd(ab, bc, &f)
        w.Write(f)
        bc.CopyTo(&ab)
        bMat.CopyTo(&aMat)
        mat.CopyTo(&bMat)
    }
    w.Close()
}