運動模板檢測
#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 調取...