1. 程式人生 > >目標檢測(一):背景減法

目標檢測(一):背景減法

       目標檢測是將運動的物體從背景中檢測出來,人們希望設計能適用於各種監控環境,不受光照、天氣等外界因素影響的目標檢測演算法。但這種演算法難免複雜度大,現有一些演算法大多是針對某一類問題提出的,主要包括背景減法、相鄰幀差法和光流法等1.1背景減法

       背景減法(backgroundsubtraction)是目前運動目標檢測的主流方法,其基本思想是將當前每一幀影象與事先儲存或實時獲取的背景影象相減,計算出與背景偏離超過一定閥值的區域作為運動區域。該演算法實現簡單,相減結果直接給出目標的位置、大小、形狀等資訊,能夠提供關於運動目標區域的完整描述,特別是對於攝像機靜止的情況,背景減法是實現運動目標實時檢測和提取的首選方法。        背景減法實現的關鍵是背景模型的獲取和更新。背景獲取演算法通常要求在場景中存在運動目標的情況下獲取背景影象,更新過程使背景能夠適應場景的各種變化和干擾,如外界光線的改變,背景中物件的擾動和固定物件的移動,陰影的影響等。一種典型的背景建模方法是用混合高斯模型描述背景影象畫素值的分佈,目標檢測過程中判斷影象的當前畫素值是否符合該分佈,若是被判為前景點,否則為背景點。同時根據新獲取的影象,對背景影象引數進行自適應更新。該方法能夠可靠處理光照變化、背景混亂運動的干擾以及長時間的場景變化等。在此基礎上,對背景、靜止目標和運動目標三者採取不同的更新策略,以減弱背景更新過程中運動目標對背景的影響。

1.2 BS演算法

 OpenCV提供的BS演算法:

  • 影象分割(GMM - 高斯混合模型)
  • 機器學習(KNN - K個最近鄰)

   以下程式碼將通過GMM和KNN兩種方法,實現了實時檢測運動目標效果的對比。

程式碼:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
	VideoCapture cap(0);

	if (!cap.isOpened())
	{
		printf("\nCan not open camera \n");
		return -1;
	}
	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

	// intialization BS
	Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
   //Ptr<BackgroundSubtractor> pKNN = createBackgroundSubtractorKNN();

	Mat tmp_frame;
	Mat bsmaskMOG2, bsmaskKNN;

	for (;;)
	{
		cap >> tmp_frame;
		if (tmp_frame.empty())
			break;
		// MOG BS
		pMOG2->apply(tmp_frame, bsmaskMOG2);
		morphologyEx(bsmaskMOG2, bsmaskMOG2, MORPH_OPEN, kernel, Point(-1, -1));
		imshow("MOG2", bsmaskMOG2);

		// KNN BS mask
		//pKNN->apply(tmp_frame, bsmaskKNN);
		//imshow("KNN Model", bsmaskKNN);

		imshow("video", tmp_frame);
		
		char keycode = (char)waitKey(30);//按ESC推出
		if (keycode == 27)
			break;
	}
	cap.release();
	return 0;
}