美文网首页
java基于opencv实现监控摄像头视频遮挡异常报警

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

作者: 安易学车 | 来源:发表于2023-06-20 13:55 被阅读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;

            }

        }

    }

    相关文章

      网友评论

          本文标题:java基于opencv实现监控摄像头视频遮挡异常报警

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