使用HOG描述符进行人体检测

时间:2016-05-31 13:56:28

标签: c++ opencv object-detection descriptor

我是新手使用HOG探测器在路上探测人类,我已经编写了代码并尝试运行它,但它总是出现错误:“hog.setSVMDetector(HOGDescriptor: :getDefaultPeopleDetector());”这一行,任何人都可以告诉我我的代码有什么问题吗?

    #include < stdio.h>
    #include < iostream>
    #include < opencv2\opencv.hpp>
    #include < opencv2/core/core.hpp>
    #include < opencv2/highgui/highgui.hpp>
    #include < opencv2/video/background_segm.hpp>
    #include <opencv2/imgproc.hpp>
    #include <opencv2/objdetect.hpp>
    #include <peopledetect.cpp>

    using namespace cv;
    using namespace std;

    int main(int argc, const char * argv[])
    {
        VideoCapture cap(0);
        cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
        cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);

        if (!cap.isOpened())
            return -1;

        Mat img;
        namedWindow("opencv", CV_WINDOW_AUTOSIZE);
        HOGDescriptor hog;
        hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());

        while (true)
        {
            cap >> img;
            if (img.empty())
                continue;

            vector<Rect> found, found_filtered;
            hog.detectMultiScale(img, found, 0, Size(8, 8), Size(32, 32), 1.05, 2);
            size_t i, j;
            for (i = 0; i<found.size(); i++)
            {
                Rect r = found[i];
                for (j = 0; j<found.size(); j++)
                    if (j != i && (r & found[j]) == r)
                        break;
                if (j == found.size())
                    found_filtered.push_back(r);
            }

            for (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(img, r.tl(), r.br(), Scalar(0, 255, 0), 3);
            }

            imshow("opencv", img);
            waitKey(1);
        }
        return 0;
    }

1 个答案:

答案 0 :(得分:1)

通常,您不应该在C ++程序中包含.cpp文件。有.h和.hpp标题。

现在,对于您的特定问题,如果我们正在讨论相同的peopledetect.cpp,那么您所需的函数不是在那里定义的,而是在那里包含的标题中...您可能已经有了正确的标题(objdetect.hpp )所以只需删除#include <peopledetect.cpp>

相关问题