實(shí)現(xiàn)監(jiān)控?cái)z像頭視頻遮擋異常檢測(cè)需要以下步驟:
1、預(yù)處理視頻:將視頻分成若干個(gè)幀赫舒,每個(gè)幀使用OpenCV進(jìn)行圖像處理,去除噪聲和偽影闽瓢,同時(shí)增強(qiáng)對(duì)比度接癌。
2、檢測(cè)遮擋:使用OpenCV的圖像閾值化處理扣讼,分析每個(gè)像素點(diǎn)的變化缺猛,判斷遮擋情況。
3椭符、異常診斷:對(duì)于檢測(cè)到的遮擋荔燎,利用統(tǒng)計(jì)方法(如基于檢測(cè)幀數(shù)的百分比)計(jì)算識(shí)別概率,并設(shè)定閾值艰山,超出閾值則發(fā)送警報(bào)或提示等操作湖雹。
4、作出響應(yīng):根據(jù)判斷結(jié)果曙搬,作出相應(yīng)響應(yīng)摔吏,如警報(bào)、通知管理員等纵装。
下面是Java代碼的實(shí)現(xiàn)示例:
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;
/**
* 視頻遮擋報(bào)警
*/
public class CameraMonitor {
? ? // 閾值征讲,超過(guò)該值則認(rèn)定為遮擋
? ? private static final double THRESHOLD = 0.3;
? ? static {
? ? ? ? System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
? ? }
? ? public static void main(String[] args) {
? ? ? ? // 打開(kāi)攝像頭
? ? ? ? VideoCapture cap = new VideoCapture();
? ? ? ? cap.open(0);
? ? ? ? // 初始化幀計(jì)數(shù)器、監(jiān)聽(tīng)器
? ? ? ? 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("當(dāng)前遮擋率為:" + occlusionPercent);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? // 顯示處理后的幀
? ? ? ? ? ? BufferedImage img = matToBufferedImage(frame);
? ? ? ? ? ? if (img != null) {
? ? ? ? ? ? ? ? listener.updateImage(img);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? cap.release();
? ? ? ? System.exit(0);
? ? }
? ? /**
? ? * BufferedImage轉(zhuǎn)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;
? ? }
? ? // 計(jì)算遮擋率
? ? 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轉(zhuǎn)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;
? ? }
? ? // 實(shí)時(shí)視頻幀監(jiān)聽(tīng)器
? ? private static class VideoFrameListener implements ActionListener {
? ? ? ? private static BufferedImage lastImage;
? ? ? ? @Override
? ? ? ? public void actionPerformed(ActionEvent e) {
? ? ? ? ? ? JOptionPane.showMessageDialog(null, "視頻遮擋诗箍!", "警報(bào)", 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;
? ? ? ? }
? ? }
}