關於HOG特征可以看http://blog.csdn.net/zouxy09/article/details/7929348和http://www.cnblogs.com/tornadomeet/archive/2012/08/15/2640754.html,
關於OpenCV HOGDescriptor參數圖解可以參考這裡http://blog.csdn.net/raodotcong/article/details/6239431;
現在利用HOG特征來進行行人檢測,既然要有了特征,現在其實要有一個方法來判斷是否一個圖片的某一部分是行人,SVM是一個很好的機器學習方法,可以用來分類,結合HOG特征就可以用來檢測圖片中的行人。OpenCV中集成了一個方法,getDefaultPeopleDetector等可以直接得到一個SVM的分類器,這個分類器是OpenCV自帶的已經訓練好的,可以直接拿來使用。下面可以看一下使用它的代碼。
OpenCV自帶SVM分類器使用:
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char** argv) { cv::Mat image = cv::imread("G:\\視頻分析入門練習\\視頻分析入門練習 - 附件\\testingdata for HOG\\frame_0061.jpg"); if (image.empty()) { std::cout << "read imagefailed"<< std::endl; } // 1. 定義HOG對象 cv::HOGDescriptor hog; // 采用默認參數 // 2. 設置SVM分類器 hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); // 采用已經訓練好的行人檢測分類器 // 3. 在測試圖像上檢測行人區域 std::vector<cv::Rect> regions; hog.detectMultiScale(image, regions, 0, cv::Size(8, 8), cv::Size(32, 32), 1.05, 1); // 顯示 for (size_t i = 0; i < regions.size(); i++) { cv::rectangle(image, regions[i], cv::Scalar(0, 0, 255),2); //對判定是行人的區域畫一個正方形標記一下。 } cv::imshow("hog", image); cv::waitKey(0); return 0; }
結果:
返回欄目頁:http://www.bianceng.cn/Programming/cplus/
上面使用的OpenCV自帶的SVM分類器,但是針對特定應用場景,很有必要進行重新訓練得到適合的分類器。實現的代碼可以從這裡得到:http://download.csdn.net/detail/u013035103/7809229,效果不是很好,個人覺得訓練的樣本數量有點少,導致這樣。
作者:csdn博客 鐘桓