美文网首页
2018-08-28:帧差法实现

2018-08-28:帧差法实现

作者: linyk3 | 来源:发表于2018-08-28 23:22 被阅读0次

    昨天查了帧差法的相关资料,可以用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:帧差法实现

          本文链接:https://www.haomeiwen.com/subject/quycwftx.html