opencv之運動模板跟蹤

2021-06-22 06:53:18 字數 4703 閱讀 9533

#include "cv.h"

#include "highgui.h"

#include #include #include #include // various tracking parameters (in seconds)

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;

// ring image buffer

//iplimage **buf = 0;//注釋掉這句,改為下句

iplimage *buf[n];

int last = 0;

// temporary images

iplimage *mhi = 0; // mhi: motion history image

iplimage *orient = 0; // orientation

iplimage *mask = 0; // valid orientation mask

iplimage *segmask = 0; // motion segmentation map

cvmemstorage* storage = 0; // temporary storage

// 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 ); // convert frame to grayscale

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

last = idx2;

silh = buf[idx2];

// 相鄰兩幀的差

cvabsdiff( buf[idx1], buf[idx2], silh ); // get difference between frames

// 對差影象做二值化

cvthreshold( silh, silh, diff_threshold, 1, cv_thresh_binary ); // and threshold it

cvupdatemotionhistory( silh, mhi, timestamp, mhi_duration ); // update mhi

// 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 -> dist : convert to blue image,影象融合

//上句用藍色的顯示效果,表現出動作時間的先後書序

//cvcvtplanetopix(mask, mask, mask, 0, dst);//白色顯示效果

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

// filter size = 3

cvcalcmotiongradient( mhi, mask, orient,

max_time_delta, min_time_delta, 3 );

if( !storage )

storage = cvcreatememstorage(0);

else

cvclearmemstorage(storage);

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

// segmask is marked motion components map. it is not used further

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

// iterate through the motion components,

// one more iteration (i == -1) corresponds to the whole image (global motion)

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

else

// select component 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

// 在輪廓內計算點數

OpenCV學習之運動模板檢測

運動模板檢測 include cv.h include highgui.h include include include include 不同的跟蹤引數 const double mhi duration 0.5 const double max time delta 0.5 const doub...

Opencv之邊界跟蹤

問題描述 一般是將二值化後的影象進行邊界的提取。需要說明的是這個提取不是簡單的找到邊界,而是按照順序的找出來。即邊界上的點是按照鄰接關係依次給出。相關演算法 1 這裡解釋 程式實現 還有canny演算法之類的一推 opencv的現有演算法 有兩個函式 findcontours和cvfindconto...

運動目標跟蹤

運動目標跟蹤 mot 子系統 也稱為移動障礙物的檢測器和 datmo 負責檢測和跟蹤自動駕駛汽車周圍環境中移動的障礙物的姿態。這個子系統對於讓自動駕駛汽車決定如何行動以避免與可能移動的物體 如其他車輛和行人 相撞至關重要。移動障礙物在一段時間內的位置通常是由測距感測器 如雷射雷達和雷達 或立體和單目...