3C科技 娛樂遊戲 美食旅遊 時尚美妝 親子育兒 生活休閒 金融理財 健康運動 寰宇綜合

Zi 字媒體

2017-07-25T20:27:27+00:00
加入好友
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提供 原文連結

寫了 5860316篇文章,獲得 23313次喜歡
精彩推薦