昨天查了帧差法的相关资料,可以用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);
}
}
网友评论