三幀幀差法改進 使用迴圈佇列減少深拷貝

2021-07-01 23:24:24 字數 2550 閱讀 2368

幀差法是背景減圖法中的一種,只不過是幀差法不需要建模,因為它的背景模型就是上一幀的圖,所以速度非常快。對於幀差法的」雙影」現象,有人提出來了三幀差法。其原理如下所示:

1. 由i(t) - i(t-1)得到前景圖   f1

2. 由i(t+1) - i(t)得到前景圖  f2

3.  f1 ∩ f2得到前景圖        f3

為了減少影象深拷貝帶來的時間開銷,我使用了乙個儲存三幀影象的迴圈佇列,只需調整隊首、隊尾指標,就可以定位相對的前、中、後三幀,避免直接使用陣列造成的影象資料深拷貝。

;//用於三幀幀差法的迴圈佇列,增加乙個空位用來佇列判滿

int front ,rear; //隊頭,隊尾

int ncount = 0; //記錄幀數

iplimage *frontimg = null; //前一幀

iplimage *midimg = null; //中間幀

iplimage *rearimg = null; //後一幀

iplimage *imask = null;

iplimage *imask1=null;

iplimage *imask2=null;

iplimage *imask3=null;

iplimage *mframe=null;

dword start=gettickcount();

cvcapture *capture = cvcreatefilecapture("e:\\test\\video\\fire1.mp4");

int fps = cvgetcaptureproperty(capture,cv_cap_prop_fps);

printf("\n使用迴圈佇列的三幀幀差法\n");

int framenum = (int) cvgetcaptureproperty(capture, cv_cap_prop_frame_count);

printf("\n總幀數%d\n",framenum);

while(mframe=cvqueryframe(capture))

if(ncount==1)

rear = (rear + 1)%max_queue; //第一幀疑似火焰影象入隊

cvcvtcolor(mframe,diffqueue[rear],cv_bgr2gray); //將圖形幀的灰度圖儲存在迴圈佇列中

} //佇列不滿則火焰疑似幀繼續入隊

else if((rear+1)%max_queue != front)

else

} dword finish=gettickcount();

cout<

普通三幀幀差法處理速度:        48.8ms/幀

使用迴圈佇列幀差法處理速度:25.5ms/幀

相對於使用cvcopy的普通三幀幀差法,使用迴圈佇列儲存影象的用時只是前者的52.2%。

Open CV 三幀差法

首先 去連續三幅圖定義為 其中image1 image2 做幀的差值運算 image2 image3 做幀的差值運算 並將他們差值做平滑處理和閾值處理 轉化成二值影象 然後將其進行位與運算得出結果result include highgui.h include cv.h include cxcore...

OpenCV實現幀差法

幀差法的優勢是運算量小,實時性好,可以獲得不錯的輪廓。缺點是不夠精細,閾值過高容易漏檢,過低則無法做到noise tolerance.另外如果發生光照突變等情況,幀差法會把整副影象當成運動區域。以下是實現的 include highgui.h include cv.h void main if fr...

python opencv 幀差法目標檢測

author qq群686070107 import cv2 import numpy as np camera cv2.videocapture 0 引數0表示第乙個攝像頭 if camera.isopened print open else print 攝像頭未開啟 size int camer...