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