java基于opencv实现监控摄像头视频遮挡异常报警

2023-06-20  本文已影响0人  安易学车

实现监控摄像头视频遮挡异常检测需要以下步骤:

1、预处理视频:将视频分成若干个帧,每个帧使用OpenCV进行图像处理,去除噪声和伪影,同时增强对比度。

2、检测遮挡:使用OpenCV的图像阈值化处理,分析每个像素点的变化,判断遮挡情况。

3、异常诊断:对于检测到的遮挡,利用统计方法(如基于检测帧数的百分比)计算识别概率,并设定阈值,超出阈值则发送警报或提示等操作。

4、作出响应:根据判断结果,作出相应响应,如警报、通知管理员等。

下面是Java代码的实现示例:

package com.ghzn.helmet.test;

import org.opencv.core.*;

import org.opencv.highgui.HighGui;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.imgproc.Imgproc;

import org.opencv.videoio.VideoCapture;

import javax.imageio.ImageIO;

import javax.swing.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.image.BufferedImage;

import java.awt.image.DataBufferByte;

import java.io.ByteArrayInputStream;

/**

* 视频遮挡报警

*/

public class CameraMonitor {

    // 阈值,超过该值则认定为遮挡

    private static final double THRESHOLD = 0.3;

    static {

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

    }

    public static void main(String[] args) {

        // 打开摄像头

        VideoCapture cap = new VideoCapture();

        cap.open(0);

        // 初始化帧计数器、监听器

        int frames = 0;

        double occlusionPercent = 0;

        VideoFrameListener listener = new VideoFrameListener();

        Mat frame = new Mat();

        while (cap.read(frame)) {

            // 帧处理逻辑

            frames++;

            if (frames>1){

                occlusionPercent = calculateOcclusionPercent(frame);

                if (occlusionPercent > THRESHOLD) {

                    listener.actionPerformed(null);

                    System.out.println("遮挡异常!遮挡率为:" + occlusionPercent);

                } else {

                    System.out.println("当前遮挡率为:" + occlusionPercent);

                }

            }

            // 显示处理后的帧

            BufferedImage img = matToBufferedImage(frame);

            if (img != null) {

                listener.updateImage(img);

            }

        }

        cap.release();

        System.exit(0);

    }

    /**

    * BufferedImage转Mat

    * @param image

    * @return

    */

    public static Mat convertBufToMat(BufferedImage image) {

        byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();

        Mat mat = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);

        mat.put(0, 0, pixels);

        Mat matBGR = new Mat();

        Core.convertScaleAbs(mat, matBGR, 1.0, 0);

        return matBGR;

    }

    // 计算遮挡率

    private static double calculateOcclusionPercent(Mat frame) {

        Mat grayFrame = new Mat();

        Imgproc.cvtColor(frame, grayFrame, Imgproc.COLOR_BGR2GRAY);

        Mat lastFrame = new Mat();

        Mat lastImage =convertBufToMat(VideoFrameListener.getLastImage());

        Imgproc.cvtColor(lastImage, lastFrame, Imgproc.COLOR_BGR2GRAY);

        Mat diff = new Mat();

        Core.subtract(grayFrame, lastFrame, diff);

        Mat threshold = new Mat();

        Imgproc.threshold(diff, threshold, 50, 255, Imgproc.THRESH_BINARY);

        double allPixel = threshold.total();

        double whitePixel = Core.countNonZero(threshold);

        return whitePixel / allPixel;

    }

    // Mat转BufferedImage

    private static BufferedImage matToBufferedImage(Mat mat) {

        MatOfByte bytemat = new MatOfByte();

        Imgcodecs.imencode(".jpg", mat, bytemat);

        byte[] bytes = bytemat.toArray();

        BufferedImage img = null;

        try {

            img = ImageIO.read(new ByteArrayInputStream(bytes));

        } catch (Exception e) {

            e.printStackTrace();

        }

        return img;

    }

    // 实时视频帧监听器

    private static class VideoFrameListener implements ActionListener {

        private static BufferedImage lastImage;

        @Override

        public void actionPerformed(ActionEvent e) {

            JOptionPane.showMessageDialog(null, "视频遮挡!", "警报", JOptionPane.WARNING_MESSAGE);

        }

        public void updateImage(BufferedImage image) {

            lastImage = image;

            JFrame frame = new JFrame();

            JLabel label = new JLabel();

            label.setIcon(new ImageIcon(lastImage));

            frame.add(label);

            frame.setSize(lastImage.getWidth(), lastImage.getHeight());

            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            frame.setVisible(true);

        }

        public static BufferedImage getLastImage() {

            return lastImage;

        }

    }

}

上一篇下一篇

猜你喜欢

热点阅读