HOGDescriptor::detectMultiScale() 함수는 입력 영상 img에서 다양한 크기의 객체 사각형 영역을 검출하고, 그 결과를 std::vector<Rect> 타입의 인자 foundLocations에 저장합니다. 두 개의 HOGDescriptor::detectMultiScale() 함수 중에서 첫 번째 함수는 검출된 사각형 영역에 대한 신뢰도를 함께 반환합니다.
HOGDescriptor 클래스를 이용하여 동영상에서 보행자를 검출하는 예제 코드를 코드 13-5에 나타냈습니다. 코드 13-5에 나타난 보행자 검출 예제 프로그램은 HOGDescriptor 클래스가 제공하는 보행자 검출 HOG 정보를 이용하여 동영상 매 프레임에서 보행자를 검출하고, 그 결과를 화면에 표시합니다. 코드 13-5의 예제 코드는 내려받은 예제 파일 중 ch13/hog 프로젝트 폴더에서 확인할 수 있습니다.
코드 13-5 보행자 검출 예제 프로그램 [ch13/hog]
01 #include "opencv2/opencv.hpp" 02 #include <iostream> 03 04 using namespace cv; 05 using namespace std; 06 07 int main() 08 { 09 VideoCapture cap("vtest.avi"); 10 11 if (!cap.isOpened()) { 12 cerr << "Video open failed!" << endl; 13 return -1; 14 } 15 16 HOGDescriptor hog; 17 hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); 18 19 Mat frame; 20 while (true) { 21 cap >> frame; 22 if (frame.empty()) 23 break; 24 25 vector<Rect> detected; 26 hog.detectMultiScale(frame, detected); 27 28 for (Rect r : detected) { 29 Scalar c = Scalar(rand() % 256, rand() % 256, rand() % 256); 30 rectangle(frame, r, c, 3); 31 } 32 33 imshow("frame", frame); 34 35 if (waitKey(10) = = 27) 36 break; 37 } 38 39 return 0; 40 }
• 9행 현재 폴더에서 vtest.avi 파일을 불러옵니다. 프로그램 시작 전에 vtest.avi 파일을 미리 현재 폴더로 복사해야 합니다.
• 16행 HOGDescriptor 객체 hog를 선언합니다.
• 17행 보행자 검출을 위한 용도로 훈련된 SVM 분류기 계수를 등록합니다.
• 25~26행 동영상 매 프레임마다 보행자 검출을 수행합니다. 검출된 사각형 정보는 detected 변수에 저장됩니다.
• 28~31행 검출된 사각형 정보를 이용하여 임의의 색상으로 3픽셀 두께의 사각형을 그립니다.