2018-08-28:帧差法实现

昨天查了帧差法的相关资料,可以用OpenCV中Core类中的方法来实现帧差计算,核心函数就是:

 Mat mat1 = Imgcodecs.imread(imgsrc1);  
 Mat mat2 = Imgcodecs.imread(imgsrc2);
 Imgproc.resize(mat1, mat3, new Size(600, 500));
 Imgproc.resize(mat2, mat4, new Size(600, 500));
 Core.absdiff(mat3, mat4, tmp);

首先将两张图片转化为Mat对象,然后计算两个Mat 矩阵对象之间的绝对值差,这个要求两个矩阵的长和宽要一样,所以需要将两个Mat先用resize函数重新设置长和宽。absdiff函数将两个矩阵的绝对值差计算结果存在Mat中。
图片1:


001.JPG

图片2:


002.JPG

可以利用函数Core.sumElems(tmp);计算矩阵差的元素的总和。

Scalar scalar = Core.sumElems(tmp);
System.out.println(scalar.toString());

得到结果:

[3136469.0, 2907399.0, 2955439.0, 0.0]

这四个只分别是矩阵元素求和的 RGB值和透明度。

两个照片中相同的像素点,差值为0,至少是接近0,所以求差的矩阵中的值大部分接近0,都是黑色图像:


101.JPG

如果两个图片之间基本有变化,求差矩阵中差值会比较大,否则的话基本接近0,图片都是黑的,所以可以根据求差矩阵元素之和中的RGB值大小来判断时候有运动物体在图像中。

完整代码:

package com.linyk3.facedetection;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class FrameDiffDetector {

    private static int imgCount = 0;
    public static void main(String[] args) {
        // 加载OpenCV类库
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        String xmlPath = FrameDiffDetector.class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1) ; 
        String srcPath = FrameDiffDetector.class.getResource("/img/src/").getPath().substring(1);
        String dstPath = FrameDiffDetector.class.getResource("/img/dst/").getPath().substring(1);
        // 检测图片
        String imgsrc1 = srcPath+ "001.JPG";
        String imgsrc2 = srcPath+ "002.JPG";
        String imgdst1 = dstPath+ "101.JPG";
        String imgdst2 = dstPath+ "102.JPG";
        // 将图片转化为Mat对象
        Mat mat1 = Imgcodecs.imread(imgsrc1);
        Mat mat2 = Imgcodecs.imread(imgsrc2);
        Mat mat3 = new Mat();
        Mat mat4 = new Mat();
        System.out.println(mat1.cols());
        System.out.println(mat1.rows());
        // 重置Mat对象大小
        Imgproc.resize(mat1, mat3, new Size(600, 500));
        Imgproc.resize(mat2, mat4, new Size(600, 500));
        Mat tmp = new Mat();
        // 两个Mat对象差分求值
        Core.absdiff(mat3, mat4, tmp);
        // 计算矩阵元素之和
        Scalar scalar = Core.sumElems(tmp);
        System.out.println(scalar.toString());
        
        if(scalar.val[0] > 777777) {
            System.out.println("存在运动物体");
        } else {
            System.out.println("不存在运动物体");
        }
        // 将矩阵转化为图片
        Imgcodecs.imwrite(imgdst1, tmp);
    }
}

你可能感兴趣的:(2018-08-28:帧差法实现)