OpenCV學習之運動模板檢測

2021-08-04 23:46:25 字數 3916 閱讀 1452

運動模板檢測

#include "cv.h"

#include "highgui.h"

#include

#include

#include

#include

// 不同的跟蹤引數

const

double mhi_duration = 0.5;

const

double max_time_delta = 0.5;

const

double min_time_delta = 0.05;

// 用於運動檢測的迴圈幀數,與機器速度及fps設定有關

const

int n = 2;

iplimage **buf = 0;

int last = 0;

// 臨時影象

iplimage *mhi = 0; // mhi: 運動歷史影象

iplimage *orient = 0; // 方向

iplimage *mask = 0; // 有效的運動掩碼

iplimage *segmask = 0; // 運動分割對映

cvmemstorage* storage = 0; // 臨時儲存區

// parameters:

// img - input video frame

// dst - resultant motion picture

// args - optional parameters

void update_mhi(iplimage* img, iplimage* dst, int diff_threshold)

for (i = 0; i < n; i++)

cvreleaseimage(&mhi);

cvreleaseimage(&orient);

cvreleaseimage(&segmask);

cvreleaseimage(&mask);

mhi = cvcreateimage(size, ipl_depth_32f, 1);

cvzero(mhi); // clear mhi at the beginning

orient = cvcreateimage(size, ipl_depth_32f, 1);

segmask = cvcreateimage(size, ipl_depth_32f, 1);

mask = cvcreateimage(size, ipl_depth_8u, 1);

}cvcvtcolor(img, buf[last], cv_bgr2gray); //rgb幀影象格式轉換為gray

idx2 = (last + 1) % n; // index of (last - (n-1))th frame

last = idx2;

silh = buf[idx2];

// 相鄰兩幀的差

cvabsdiff(buf[idx1], buf[idx2], silh);

cvthreshold(silh, silh, diff_threshold, 1, cv_thresh_binary); // 對差影象做二值化

cvupdatemotionhistory(silh, mhi, timestamp, mhi_duration); // 更新運動歷史

// convert mhi to blue 8u image

// cvcvtscale的第四個引數 shift = (mhi_duration - timestamp)*255./mhi_duration

// 控制幀差的消失速率

cvcvtscale(mhi, mask, 255. / mhi_duration,

(mhi_duration - timestamp)*255. / mhi_duration);

cvzero(dst);

cvcvtplanetopix(mask, 0, 0, 0, dst); // b,g,r,0 convert to blue image

// 計算運動的梯度方向以及正確的方向掩碼

// filter size = 3

cvcalcmotiongradient(mhi, mask, orient,

max_time_delta, min_time_delta, 3);

if (!storage)

storage = cvcreatememstorage(0);

else

cvclearmemstorage(storage);

// 運動分割: 獲得運動部件的連續序列

seq = cvsegmentmotion(mhi, segmask, storage, timestamp, max_time_delta);

for (i = 0; i < seq->total; i++)

else

// 選擇元件roi

cvsetimageroi(silh, comp_rect);

cvsetimageroi(mhi, comp_rect);

cvsetimageroi(orient, comp_rect);

cvsetimageroi(mask, comp_rect);

// 在選擇的區域內,計算運動方向

angle = cvcalcglobalorientation(orient, mask, mhi, timestamp,

mhi_duration);

angle = 360.0 - angle; // adjust for images with top-left origin

// 在輪廓內計算點數

// norm(l1) = 所有畫素值的和

count = cvnorm(silh, 0, cv_l1, 0);

cvresetimageroi(mhi);

cvresetimageroi(orient);

cvresetimageroi(mask);

cvresetimageroi(silh);

// 檢查小運動的情形

if (count < comp_rect.width*comp_rect.height * 0.05) // 畫素的5%

continue;

// 畫乙個帶箭頭的記錄以表示方向

opencv之運動模板跟蹤

include cv.h include highgui.h include include include include various tracking parameters in seconds const double mhi duration 0.5 const double max t...

opencv學習之四十二 簡單運動檢測

背景法是 將一幅圖作為背景,讓後和每一幀對比 缺點是一開始存入的背景可能隨光照變法而造成錯誤,但是可以用在光照環境穩定的地方,優點是可以檢測之前背景沒有的景象 差幀法是 將前一幀和後一幀進行對比 缺點是無法對運動後突然又靜止的景象進行識別,優點是光照不影響 例項背景法 運動檢測,攝像頭檢測,背景法 ...

OpenCV 物體運動檢測

安裝各種環境 學習背景分割 二值化 膨脹 腐蝕等操作。原始碼 usr bin env python 汽車運動檢測 p140 import cv2 import os import numpy as np cap cv2.videocapture 1 cap cv2.videocapture 0 調取...