본문 바로가기

C

영상처리 C++ 코드 - HOG+SVM을 활용한 보행자 검출

요즘 유행하는 딥러닝도 참 좋지만 느리고 복잡하고 비용이 비싸다.

가끔은 고전적인 방식도 좋다.

사람 검출을 위해 hog로 피처를 추출해서 svm으로 사람인지 아닌지를 구분하여 box를 친다.

이를 위해 알고리즘을 추출 후 서포트 벡터 머신을 활용하였다.

default people detector와

daimler people detector를 사용하였다.

영상 >>

 

 

코드 >>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "opencv2/opencv.hpp"
#include <iostream>
#include <vector>
 
using namespace cv;
 
int detectPedestrian()
{    
    int mode = 0;
    VideoCapture cap("vtest.avi");
 
    if (!cap.isOpened()) {
        std::cerr << "Video open failed!" << std::endl;
        return -1;
    }
 
    HOGDescriptor hogDefaultPeopleDetector;
    hogDefaultPeopleDetector.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
 
    HOGDescriptor hogDaimPeopleDetector(Size(48,96),Size(16,16),Size(8,8),Size(8,8),9);
    hogDaimPeopleDetector.setSVMDetector(HOGDescriptor::getDaimlerPeopleDetector());
 
    std::vector<Rect> detected;
    Mat frame;
    while (true) {
        cap >> frame;
        if (frame.empty())
            break;
 
        
 
        if (mode == 0) {
            hogDefaultPeopleDetector.detectMultiScale(frame, detected);
            for (Rect r : detected) {
                Scalar c = Scalar(std::rand() % 256std::rand() % 256std::rand() % 256);
                rectangle(frame, r, c, 3);
                
            }
            putText(frame, "DefaultPeopleDetector...", cvPoint(3030),
                FONT_HERSHEY_COMPLEX_SMALL, 2.0, cvScalar(00255), 1, CV_AA);
        }
        else {
 
            hogDaimPeopleDetector.detectMultiScale(frame, detected, 1.2, Size(88), Size(3232), 1.056);
            for (Rect r : detected) {
                Scalar c = Scalar(std::rand() % 256std::rand() % 256std::rand() % 256);
                rectangle(frame, r, c, 3);
            }
            putText(frame, "DaimPeopleDetector...", cvPoint(3030),
                FONT_HERSHEY_COMPLEX_SMALL, 2.0, cvScalar(00255), 1, CV_AA);
 
        }
        imshow("frame", frame);
 
        if (waitKey(10== 27)
            break;
        if (waitKey(10== 109)
        {
            if (mode == 0)
                mode = 1;
            else
                mode = 0;
        }
        std::cout << "mode : " << mode << std::endl;
    }
 
    return 0;
 
}