search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

fanfuhan OpenCV 教學087 ~ opencv-087-視頻分析(基於幀差法實現移動對象分析) – jashliao部落格

fanfuhan OpenCV 教學087 ~ opencv-087-視頻分析(基於幀差法實現移動對象分析)


資料來源: https://fanfuhan.github.io/

https://fanfuhan.github.io/2019/05/08/opencv-087/

GITHUB:https://github.com/jash-git/fanfuhan_ML_OpenCV


光流跟踪與背景消除都是基於建模方式的視頻分析方法,其實這類方法最原始的一個例子就是對視頻移動對象的幀差法跟踪,這個在視頻分析與處理中也是一種很常見的手段,有時候會取得意想不到的好效果,幀差法進一步劃分有可以分為:

    ◇兩幀差
    ◇三幀差

假設有當前幀frame,前一幀prev1,更前一幀prev2

兩幀差方法直接使用前一幀減去當前幀diff = frame – prev1

三幀差方法計算如下:
diff1 = prev2 – prev1
diff2 = frame – prev1
diff = diff1 & diff2

幀差法在求取幀差之前一般會進行高斯模糊,用以減低干擾,通過得到的diff圖像進行形態學操作,用以合併與候選區域,提升效率。

幀差法的缺點有如下:
    高斯模糊是高耗時計算
    容易受到噪聲與光線干擾

C++

#include 
#include 

using namespace std;
using namespace cv;

/*
 * 视频分析(基于帧差法实现移动对象分析)
 */
int main() {
    VideoCapture capture("../images/bike.avi");
    if (!capture.isOpened()) {
        cout << "could not open video..." << endl;
        return -1;
    }

    // 读取第一帧
    Mat preFrame, preGray;
    capture.read(preFrame);
    cvtColor(preFrame, preGray, COLOR_BGR2GRAY);
    GaussianBlur(preGray, preGray, Size(0, 0), 15);

    Mat diff;
    Mat frame, gray;

    // 定义结构元素
    Mat k = getStructuringElement(MORPH_RECT, Size(7, 7));

    while (true) {
        bool ret = capture.read(frame);
        if (!ret) break;
        cvtColor(frame, gray, COLOR_BGR2GRAY);
        GaussianBlur(gray, gray, Size(0, 0), 15);
        subtract(gray, preGray, diff);
        threshold(diff, diff, 0, 255, THRESH_BINARY | THRESH_OTSU);
        morphologyEx(diff, diff, MORPH_OPEN, k);
        imshow("input", frame);
        imshow("result", diff);

        gray.copyTo(preGray);
        char c = waitKey(5);
        if (c == 27) {
            break;
        }
    }

    waitKey(0);
    return 0;
}


Python

import numpy as np
import cv2 as cv

cap = cv.VideoCapture("D:/images/video/bike.avi")
ret, prevFrame = cap.read()
prevGray = cv.cvtColor(prevFrame, cv.COLOR_BGR2GRAY)
prevGray = cv.GaussianBlur(prevGray, (0, 0), 15)
k = cv.getStructuringElement(cv.MORPH_RECT, (7, 7))
while True:
    ret, frame = cap.read()
    if ret is False:
        break
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    gray = cv.GaussianBlur(gray, (0, 0), 15)
    diff = cv.subtract(gray, prevGray)
    t, binary = cv.threshold(diff, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    binary = cv.morphologyEx(binary, cv.MORPH_OPEN, k)
    cv.imshow('input', frame)
    cv.imshow('result', binary)
    cv.imwrite("D:/result.png", binary)
    c = cv.waitKey(50)&0xff
    prevGray = np.copy(gray)
    if c == 27:
        break
cap.release()
cv.destroyAllWindows()


熱門推薦

本文由 jashliaoeuwordpress 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦