最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于opencv的行人檢測(cè)(支持圖片視頻)

 更新時(shí)間:2021年12月22日 11:38:23   作者:y1054765649  
本文主要介紹了基于opencv的行人檢測(cè)(支持圖片視頻),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

基于方向梯度直方圖(HOG)/線性支持向量機(jī)(SVM)算法的行人檢測(cè)方法中存在檢測(cè)速度慢的問(wèn)題,如下圖所示,對(duì)一張400*490像素的圖片進(jìn)行檢測(cè)要接近800毫秒,所以hog+svm的方法放在視頻中進(jìn)行行人檢測(cè)時(shí),每秒只能檢測(cè)1幀圖片,1幀/s根本不能達(dá)到視頻播放的流暢性。

本文采用先從視頻每幀的圖像中提取出物體的輪廓(也可以對(duì)前后兩針圖片做差,只對(duì)有變化的部分進(jìn)行檢測(cè),其目的一樣,都是減少運(yùn)算的面積),再對(duì)每個(gè)輪廓進(jìn)行HOG+SVM檢測(cè),判斷是否為行人??梢源蟠蟮目s減HOG+SVM的面積,經(jīng)實(shí)測(cè),檢測(cè)速度可以達(dá)到10幀/S,可以勉強(qiáng)達(dá)到視頻流暢的要求。

輪廓的提取用的是cv::findContours的API,感興趣的可以自己去查看相關(guān)資料

首先介紹下方向梯度直方圖。

在圖像或者視頻幀中,邊緣方向密度分布可以很好地描述局部目標(biāo)的形狀和表象,也就是說(shuō)通過(guò) HOG特征,可以有效地將人體和復(fù)雜背景區(qū)分出來(lái)。對(duì)于行人檢測(cè)中 HOG 特征提取的具體實(shí)現(xiàn)方法是: 將視頻中的每一幀通過(guò)滑動(dòng)窗口切割成很小的區(qū)域( Cell) ,通過(guò)計(jì)算每個(gè)區(qū)域面的方向梯度特征,得到每個(gè)區(qū)域的方向特征直方圖,小區(qū)域再組成更大的區(qū)域,通過(guò)將區(qū)域的方向梯度特征組合起來(lái)并在塊單元中進(jìn)行歸一化處理,就形成了一個(gè) Block 內(nèi) HOG 描述子,遍歷搜索所有的方向特征從而最終構(gòu)成一個(gè)幀的 HOG 描述特征向量。算法的過(guò)程[3]分為:

①將一個(gè)視頻的每一幀進(jìn)行灰度化處理。把視頻的每一幀彩色空間變成灰度空間,因?yàn)?HOG 中不需要彩色信息的幫助。

②對(duì)輸入的視頻的每一幀進(jìn)行顏色空間的歸一化。由于視頻中人信息的復(fù)雜性,背影的灰暗程度以及光照的影響都對(duì)檢測(cè)器的魯棒性有一定的影響,歸一化可以很大程度上降低這些的影響。這 里 使 用gamma 校正: 對(duì)像素值求其平方根( 降低數(shù)值大小) 。

③計(jì)算像素梯度。這是 HOG 特征檢測(cè)中最重要的一個(gè)環(huán)節(jié),通過(guò)像素的梯度方向直方圖來(lái)描述像素的特征。特別注意的是我們不需要做平滑處理,因?yàn)槠交幚淼谋举|(zhì)就是迷糊圖像,降低了像素邊緣信息,因而就不能很好地提取邊緣信息來(lái)表達(dá)特征。

④將圖像劃分成小 cell。這一步我們需要為計(jì)算梯度,建立梯度方向直方圖定義一個(gè)載體,因此這里把圖像分割成很小的區(qū)域,這里稱為細(xì)胞單元,實(shí)驗(yàn)表明6 × 6 像素的細(xì)胞單元效果最佳。接著采用 9 個(gè)直方圖來(lái)統(tǒng)計(jì)一個(gè)細(xì)胞單元里面的特征信息。360°不考慮
正負(fù)方向,把方向分成 9 份,如圖 1 所示,稱為 bin,也就是每一個(gè) bin 對(duì)應(yīng) 20°,這樣就把梯度方向映射到直方圖里面,9 個(gè)方向特征向量代表 9 個(gè) bin,增幅就代表每一個(gè) bin 的權(quán)值。

⑤統(tǒng)計(jì)每個(gè) cell 的梯度直方圖即可形成每個(gè) cell的 descriptor。

⑥將每幾個(gè) cell 組成一個(gè) block,一個(gè) block 內(nèi)所有 cell 的特征串聯(lián)起來(lái),便得到該 block 的 HOG 特征descriptor。

⑦將圖像內(nèi)所有 block 的 HOG 特征收集起來(lái)就可得到該圖像特征向量。

支持向量機(jī)

支持向量機(jī)( Support Vector Machine) 就是風(fēng)險(xiǎn)降低到最小程度上,尋找最優(yōu)的解決方案。視頻檢測(cè)特征分類中,就是針對(duì)低維空間的線性不可分問(wèn)題,通過(guò)核函數(shù)映射到高維空間達(dá)到線性可分,再進(jìn)行線性分割實(shí)現(xiàn)特征分類。
SVM 具有以下幾個(gè)特點(diǎn):
( 1) 小樣本。
( 2) 非 線 性 問(wèn) 題。即針對(duì)線性的不可分問(wèn)題,SVM 通過(guò)松弛變量以及核函數(shù)進(jìn)行解決。
( 3) 高維模式識(shí)別。在某些樣本,例如密集型特征,可以達(dá)到幾萬(wàn)甚至十幾萬(wàn)的維數(shù),如果不對(duì)樣本進(jìn)行降維,SVM 也能夠找出支持向量樣本,對(duì)這些特征訓(xùn)練出優(yōu)秀的分類器。

視頻檢測(cè)代碼:

void video_test() {
	void display(Mat, vector<Rect>&);            
	//void Crop_picture();     
	//void train();
	//void save_hard_example();
	
	//Crop_picture();     //裁切負(fù)樣本圖片,每張負(fù)樣本圖片隨機(jī)裁成10張
	//train();          //訓(xùn)練正負(fù)樣本
	//save_hardexample()     //根據(jù)正負(fù)樣本得到的檢測(cè)子,對(duì)INRIAPerson/Train/neg/中的圖片進(jìn)行測(cè)試,并將錯(cuò)檢的樣本保存
	//train();      //訓(xùn)練正負(fù)樣本及難例樣本
	
 
	//加載svm分類器的系數(shù)
	HOGDescriptor hog; string str;
	vector<float> detector;
	/*ifstream fin("HOGDetectorForOpenCV.txt");
	while (getline(fin, str))
	{
		detector.push_back(stringToNum<float>(str));
	}
*/
 
	vector<Rect> people;
	VideoCapture capture(VideotestPath);
	/*if (!capture.isOpened())
	return -1;*/
	Mat frame, foreground;
	
 
	int num = 0; 
	Ptr<BackgroundSubtractorMOG2> mod = createBackgroundSubtractorMOG2();
 
	while (true)
	{
		vector<Rect> rect6;
		if (!capture.read(frame))
		break;
		mod->apply(frame, foreground, 0.01);
		hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
		//hog.setSVMDetector(detector);
		vector<Rect> rect5;
		display(foreground, rect5);
		vector<Rect> ret = rect5;
		for (auto i = 0; i != ret.size(); i++)
		{
			Mat a = frame;
		
 
			if (ret[i].x > 50 && ret[i].y > 50 && ret[i].x + ret[i].width <670 && ret[i].y + ret[i].height < 520)
			{
				ret[i].x = ret[i].x - 50;
				ret[i].y = ret[i].y - 50; ret[i].width = ret[i].width + 100; ret[i].height = ret[i].height + 100;
			}
			Mat src(a(ret[i]));
			cout << ret[i].x << " " << ret[i].y << " " << ret[i].width << " " << ret[i].height << endl;
			// imshow("aa", src); waitKey(0);
			// cv::namedWindow("src", CV_WINDOW_NORMAL); 
 
 
 
			if (ret[i].width >= 64 && ret[i].height >= 128)
 
				hog.detectMultiScale(src, people, 0, Size(4, 4), Size(0, 0), 1.07, 2);
			//cout << people.size()<<endl;
			for (size_t j = 0; j < people.size(); j++)
			{
				people[j].x += ret[i].x; people[j].y += ret[i].y;
				rect6.push_back(people[j]);
				//rectangle(frame, people[j], cv::Scalar(0, 0, 255), 2);
			}
			//imshow(" ", frame); waitKey(0);
 
		}
		//因?yàn)槎喑叨葯z測(cè)得到的結(jié)果矩形框較大,按比例縮減矩形框
		for (auto h = 0; h != rect6.size(); h++)
		{
			rect6[h].x += cvRound(rect6[h].width*0.1);
			rect6[h].width = cvRound(rect6[h].width*0.8);
			rect6[h].y += cvRound(rect6[h].height*0.07);
			rect6[h].height = cvRound(rect6[h].height*0.8);
			rectangle(frame, rect6[h], cv::Scalar(0, 0, 255), 1);
			//rect2[h] = boundingRect(frame);
		}
		imshow(" ", frame); waitKey(1);
	}
	waitKey();
}

提取輪廓的代碼:

void display(Mat gray_diff, vector<Rect>& rect)
{
	//Mat res = src.clone();
	vector<vector<Point>> cts;  //定義輪廓數(shù)組
	findContours(gray_diff, cts, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //查找輪廓,,模式為只檢測(cè)外輪廓,并存儲(chǔ)所有的輪廓點(diǎn)
																		  //vector<Rect> rect; //定義矩形邊框
	for (int i = 0; i < cts.size(); i++)
	{
		if (contourArea(cts[i])>th_area)       //計(jì)算輪廓的面積,排除小的干擾輪廓
			
			  //查找外部矩形邊界  
			rect.push_back(boundingRect(cts[i]));   //計(jì)算輪廓的垂直邊界最小矩形
 
	}
	cout << rect.size() << endl;     //輸出輪廓個(gè)數(shù)
}

檢測(cè)效果:

進(jìn)行HOG+SVM的四個(gè)頂點(diǎn)像素坐標(biāo)。可以看到每次運(yùn)算的面積小了很多。

當(dāng)然 ,是可以優(yōu)化,比如每?jī)蓭瑘D片檢測(cè)一次,下一幀圖片保持上一幀的檢測(cè)結(jié)果。比如輪廓區(qū)域的面積怎么去合適的框起來(lái),如何設(shè)定合適的閾值去濾掉小框,兩個(gè)框重疊時(shí),怎么去優(yōu)化,減小進(jìn)行運(yùn)算的面積。本文只是給個(gè)思路,具體讀者可以自己去實(shí)現(xiàn)。

貼下github 有興趣的可以去讀下 ,樣本集用的INRIA行人檢測(cè)數(shù)據(jù)集,訓(xùn)練過(guò)程就不詳述了。

github:https://github.com/ttttthub/pedestrian-detection.git

到此這篇關(guān)于基于opencv的行人檢測(cè)(支持圖片視頻)的文章就介紹到這了,更多相關(guān)opencv 行人檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • C++中map和set的簡(jiǎn)介及使用詳解

    C++中map和set的簡(jiǎn)介及使用詳解

    本文主要介紹了C++中map和set的簡(jiǎn)介及使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++用new創(chuàng)建對(duì)象和不用new創(chuàng)建對(duì)象的區(qū)別解析

    C++用new創(chuàng)建對(duì)象和不用new創(chuàng)建對(duì)象的區(qū)別解析

    在C++用new創(chuàng)建對(duì)象和不用new創(chuàng)建對(duì)象是有區(qū)別的,不知你是否清楚的了解它們到底有什么樣的區(qū)別呢?下面小編就用示例來(lái)告訴大家吧,需要的朋友可以過(guò)來(lái)參考下
    2013-07-07
  • opencv車道線檢測(cè)的實(shí)現(xiàn)方法

    opencv車道線檢測(cè)的實(shí)現(xiàn)方法

    這篇文章主要介紹了opencv車道線檢測(cè)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • C/C++實(shí)操True and false詳解

    C/C++實(shí)操True and false詳解

    這篇文章主要給大家介紹了關(guān)于Python中常用的數(shù)據(jù)類型bool(布爾)類型的兩個(gè)值:True和False的相關(guān)資料,通過(guò)示例代碼給大家進(jìn)行了解惑,讓對(duì)這兩個(gè)值有所疑惑的朋友們能有起到一定的幫助,需要的朋友下面來(lái)一起看看吧。
    2021-09-09
  • Visual Studio Code安裝和配置的教程

    Visual Studio Code安裝和配置的教程

    這篇文章主要介紹了Visual Studio Code安裝和配置,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 使用Inotify 監(jiān)控目錄與文件的方法詳解

    使用Inotify 監(jiān)控目錄與文件的方法詳解

    本篇文章是對(duì)使用Inotify 監(jiān)控目錄與文件的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++?OpenCV紅綠燈檢測(cè)Demo實(shí)現(xiàn)詳解

    C++?OpenCV紅綠燈檢測(cè)Demo實(shí)現(xiàn)詳解

    OpenCV(Open Source Computer Vision Library)是開(kāi)源的計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)庫(kù),提供了C++、 C、 Python、 Java接口,并支持Windows、 Linux、 Android、 Mac OS平臺(tái),下面這篇文章主要給大家介紹了關(guān)于C++?OpenCV紅綠燈檢測(cè)Demo實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C++ stringstream格式化輸出輸入詳情

    C++ stringstream格式化輸出輸入詳情

    這篇文章主要介紹了C++ stringstream格式化輸出輸入,首先string str; cin>>str;遇到空格結(jié)束;于是乎產(chǎn)生了getline(),可與得到一行字符串;空格自動(dòng)去掉,下面來(lái)看看文章的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2021-11-11
  • Qt中QCommandLinkButton控件的使用

    Qt中QCommandLinkButton控件的使用

    QCommandLinkButton 是 Qt 框架中 QtWidgets 模塊的一個(gè)類,它提供了一個(gè)結(jié)合了文本標(biāo)簽和按鈕功能的控件,本文主要介紹了Qt中QCommandLinkButton控件的使用,感興趣的可以了解一下
    2025-04-04
  • 詳解C++作用域與生命周期

    詳解C++作用域與生命周期

    這篇文章主要介紹了C++作用域與生命周期的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論

当涂县| 岑溪市| 宁津县| 广德县| 炎陵县| 常德市| 牙克石市| 双流县| 南华县| 蒙城县| 昭通市| 沛县| 南平市| 沙洋县| 高雄县| 根河市| 鲜城| 甘泉县| 建水县| 东乌| 璧山县| 沙田区| 盘山县| 新田县| 日喀则市| 西安市| 多伦县| 宁城县| 定远县| 澎湖县| 庄河市| 盘锦市| 永清县| 崇阳县| 乌审旗| 沧州市| 长顺县| 昌邑市| 堆龙德庆县| 江津市| 冀州市|