java基于opencv實(shí)現(xiàn)監(jiān)控?cái)z像頭視頻遮擋異常報(bào)警

實(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;

? ? ? ? }

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挽唉,隨后出現(xiàn)的幾起案子滤祖,更是在濱河造成了極大的恐慌筷狼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匠童,死亡現(xiàn)場(chǎng)離奇詭異埂材,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)汤求,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門俏险,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扬绪,你說(shuō)我怎么就攤上這事竖独。” “怎么了挤牛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵莹痢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我赊颠,道長(zhǎng)格二,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任竣蹦,我火速辦了婚禮,結(jié)果婚禮上沧奴,老公的妹妹穿的比我還像新娘痘括。我一直安慰自己,他們只是感情好滔吠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布纲菌。 她就那樣靜靜地躺著,像睡著了一般疮绷。 火紅的嫁衣襯著肌膚如雪翰舌。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天冬骚,我揣著相機(jī)與錄音椅贱,去河邊找鬼。 笑死只冻,一個(gè)胖子當(dāng)著我的面吹牛庇麦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喜德,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼山橄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了舍悯?” 一聲冷哼從身側(cè)響起航棱,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤睡雇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后饮醇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體它抱,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年驳阎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抗愁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呵晚,死狀恐怖蜘腌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饵隙,我是刑警寧澤撮珠,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站金矛,受9級(jí)特大地震影響芯急,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驶俊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一娶耍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饼酿,春花似錦榕酒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至药版,卻和暖如春辑舷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背槽片。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工何缓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筐乳。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓歌殃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蝙云。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氓皱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容