使用opencv自帶的HOG來實現行人識別
阿新 • • 發佈:2019-02-08
OpenCV中預設的SVM引數進行HOG行人檢測,預設引數是根據Dalal的方法訓練的。
//HOG行人識別 #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat src = imread("人5.jpg"); HOGDescriptor hog;//HOG特徵檢測器 hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());//設定SVM分類器為預設引數 vector<Rect> found, found_filtered;//矩形框陣列 hog.detectMultiScale(src, found, 0, Size(8, 8), Size(32, 32), 1.05, 2);//對影象進行多尺度檢測,檢測視窗移動步長為(8,8) cout << "矩形個數:" << found.size() << endl; //找出所有沒有巢狀的矩形框r,並放入found_filtered中,如果有巢狀的話,則取外面最大的那個矩形框放入found_filtered中 for (int i = 0; i < found.size(); i++) { Rect r = found[i]; int j = 0; for (; j < found.size(); j++) if (j != i && (r & found[j]) == r) break; if (j == found.size()) found_filtered.push_back(r); } cout << "過濾後矩形的個數:" << found_filtered.size() << endl; //畫矩形框,因為hog檢測出的矩形框比實際人體框要稍微大些,所以這裡需要做一些調整 for (int i = 0; i<found_filtered.size(); i++) { Rect r = found_filtered[i]; r.x += cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y += cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); rectangle(src, r.tl(), r.br(), Scalar(0, 255, 0), 3); } imwrite("ImgProcessed.jpg", src); namedWindow("src", 0); imshow("src", src); waitKey(0);//注意:imshow之後一定要加waitKey,否則無法顯示影象 system("pause"); }
可以看出,圖中15個人只檢測出了6人,實在是差強人意,要想取得好的效果只能進行SVM訓練,或者使用深度學習