欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
基于opencv的行人檢測(支持圖片,視頻)

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

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

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

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

在圖像或者視頻幀中,邊緣方向密度分布可以很好地描述局部目標的形狀和表象,也就是說(shuō)通過(guò) HOG特征,可以有效地將人體和復雜背景區分出來(lái)。對于行人檢測中 HOG 特征提取的具體實(shí)現方法是: 將視頻中的每一幀通過(guò)滑動(dòng)窗口切割成很小的區域( Cell) ,通過(guò)計算每個(gè)區域面的方向梯度特征,得到每個(gè)區域的方向特征直方圖,小區域再組成更大的區域,通過(guò)將區域的方向梯度特征組合起來(lái)并在塊單元中進(jìn)行歸一化處理,就形成了一個(gè) Block 內 HOG 描述子,遍歷搜索所有的方向特征從而最終構成一個(gè)幀的 HOG 描述特征向量。算法的過(guò)程[3]分為:
①將一個(gè)視頻的每一幀進(jìn)行灰度化處理。把視頻的每一幀彩色空間變成灰度空間,因為 HOG 中不需要彩色信息的幫助。
②對輸入的視頻的每一幀進(jìn)行顏色空間的歸一化。由于視頻中人信息的復雜性,背影的灰暗程度以及光照的影響都對檢測器的魯棒性有一定的影響,歸一化可以很大程度上降低這些的影響。這 里 使 用gamma 校正: 對像素值求其平方根( 降低數值大小) 。
③計算像素梯度。這是 HOG 特征檢測中最重要的一個(gè)環(huán)節,通過(guò)像素的梯度方向直方圖來(lái)描述像素的特征。特別注意的是我們不需要做平滑處理,因為平滑處理的本質(zhì)就是迷糊圖像,降低了像素邊緣信息,因而就不能很好地提取邊緣信息來(lái)表達特征。

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

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

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

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

支持向量機

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

視頻檢測代碼:

  1. void video_test() {
  2. void display(Mat, vector<Rect>&);
  3. //void Crop_picture();
  4. //void train();
  5. //void save_hard_example();
  6. //Crop_picture(); //裁切負樣本圖片,每張負樣本圖片隨機裁成10張
  7. //train(); //訓練正負樣本
  8. //save_hardexample() //根據正負樣本得到的檢測子,對INRIAPerson/Train/neg/中的圖片進(jìn)行測試,并將錯檢的樣本保存
  9. //train(); //訓練正負樣本及難例樣本
  10. //加載svm分類(lèi)器的系數
  11. HOGDescriptor hog; string str;
  12. vector<float> detector;
  13. /*ifstream fin("HOGDetectorForOpenCV.txt");
  14. while (getline(fin, str))
  15. {
  16. detector.push_back(stringToNum<float>(str));
  17. }
  18. */
  19. vector<Rect> people;
  20. VideoCapture capture(VideotestPath);
  21. /*if (!capture.isOpened())
  22. return -1;*/
  23. Mat frame, foreground;
  24. int num = 0;
  25. Ptr<BackgroundSubtractorMOG2> mod = createBackgroundSubtractorMOG2();
  26. while (true)
  27. {
  28. vector<Rect> rect6;
  29. if (!capture.read(frame))
  30. break;
  31. mod->apply(frame, foreground, 0.01);
  32. hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
  33. //hog.setSVMDetector(detector);
  34. vector<Rect> rect5;
  35. display(foreground, rect5);
  36. vector<Rect> ret = rect5;
  37. for (auto i = 0; i != ret.size(); i++)
  38. {
  39. Mat a = frame;
  40. if (ret[i].x > 50 && ret[i].y > 50 && ret[i].x + ret[i].width <670 && ret[i].y + ret[i].height < 520)
  41. {
  42. ret[i].x = ret[i].x - 50;
  43. ret[i].y = ret[i].y - 50; ret[i].width = ret[i].width + 100; ret[i].height = ret[i].height + 100;
  44. }
  45. Mat src(a(ret[i]));
  46. cout << ret[i].x << " " << ret[i].y << " " << ret[i].width << " " << ret[i].height << endl;
  47. // imshow("aa", src); waitKey(0);
  48. // cv::namedWindow("src", CV_WINDOW_NORMAL);
  49. if (ret[i].width >= 64 && ret[i].height >= 128)
  50. hog.detectMultiScale(src, people, 0, Size(4, 4), Size(0, 0), 1.07, 2);
  51. //cout << people.size()<<endl;
  52. for (size_t j = 0; j < people.size(); j++)
  53. {
  54. people[j].x += ret[i].x; people[j].y += ret[i].y;
  55. rect6.push_back(people[j]);
  56. //rectangle(frame, people[j], cv::Scalar(0, 0, 255), 2);
  57. }
  58. //imshow(" ", frame); waitKey(0);
  59. }
  60. //////因為多尺度檢測得到的結果矩形框較大,按比例縮減矩形框
  61. for (auto h = 0; h != rect6.size(); h++)
  62. {
  63. rect6[h].x += cvRound(rect6[h].width*0.1);
  64. rect6[h].width = cvRound(rect6[h].width*0.8);
  65. rect6[h].y += cvRound(rect6[h].height*0.07);
  66. rect6[h].height = cvRound(rect6[h].height*0.8);
  67. rectangle(frame, rect6[h], cv::Scalar(0, 0, 255), 1);
  68. //rect2[h] = boundingRect(frame);
  69. }
  70. imshow(" ", frame); waitKey(1);
  71. }
  72. waitKey();
  73. }

提取輪廓的代碼:

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

檢測效果:

進(jìn)行HOG+SVM的四個(gè)頂點(diǎn)像素坐標??梢钥吹矫看芜\算的面積小了很多。

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

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
行人檢測之HOG
HOG特征與opencv類(lèi)實(shí)現
前方車(chē)輛檢測的常用方法
【科普文】 深度學(xué)習:使用PowerVR實(shí)現計算機視覺(jué)
【學(xué)習】車(chē)輛追蹤算法大PK:SVM HOG vs. YOLO
HOG(方向梯度直方圖)與特征識別
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久