定義:
視頻通過閃過x幀畫面來實現,幀差法就是利用兩幀之間的差異找出。也就是移動目標識別
幀差法識別步驟:
1、灰度處理:將多通道變成雙通道壓縮圖像數據。
cvtColor(before_frame,before_gray,CV_RGB2GRAY);cvtColor(after_frame,after_gray,CV_RGB2GRAY);
2、偵差計算
absdiff(before_gray,after_gray,diff_frame);
3、二值化處理:將圖片變成黑色和白色兩種
/** 25:灰度值在25以上為1,在25以下為0*/threshold(diff_frame,diff_frame,25,255,CV_THRESH_BINARY);
4、降噪:去除噪點
????????開運算:先腐蝕再膨脹,用來消除小物體(圖像周邊白點)。
? ? ? ? 關鍵代碼
// 腐蝕Mat ele1=getStructuringElement(MORPH_RECT,Size(3,3));erode(diff_frame,diff_frame,ele1);// 膨脹Mat ele2=getStructuringElement(MORPH_RECT,Size(20,20));dilate(diff_frame,diff_frame,ele2);
????????閉運算:先膨脹再腐蝕,用于排除小型黑洞(圖像內部黑點)。
5、多邊擬合:將相鄰的點連成一塊區域(繪制矩形的坐標)
6、獲取坐標點,繪制矩形
// 5、多邊擬合:將相鄰的點連成一塊區域(繪制矩形的坐標)// 原始的輪廓點集合vector<vector<Point>> contours;// 它能在二值圖像diff_frame中檢測出物體的輪廓findContours(diff_frame,contours,CV_RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point(0,0));// 創建一個與 contours 大小相同的向量,用于存儲每個輪廓的簡化多邊形表示vector<vector<Point>> contours_poly(contours.size());// 創建一個與 contours 大小相同的向量,用于存儲每個簡化多邊形的外接矩形vector<Rect> boundRect(contours.size());// 6、獲取坐標點,繪制矩形int x,y,w,h;int num=contours.size();for(int i=0;i<num;i++){// 將復雜的輪廓曲線簡化為近似的多邊形approxPolyDP(Mat(contours[i]),contours_poly[i],3,true);// 計算外接矩形boundRect[i]=boundingRect(Mat(contours_poly[i]));x=boundRect[i].x;y=boundRect[i].y;w=boundRect[i].width;h=boundRect[i].height;rectangle(res_frame,Point(x,y),Point(x+w,y+h),Scalar(0,255,0));}
優點:
? ? ? ? 開銷小,占用內存和CPU算力小,對硬件配置要求不高。
缺點:
????????檢測時對畫面要求高,且監測方要固定。