Обнаружение человека с использованием дескриптора HOG

Я новичок в использовании детектора 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;
    }

person HenryChen    schedule 31.05.2016    source источник
comment
Какая-нибудь конкретная ошибка? Система загорелась? Носовые адвокаты?   -  person Martin James    schedule 31.05.2016
comment
он говорит об исключительной ситуации: 0xC0000005: чтение нарушения 0xFFFFFFFFFFFF   -  person HenryChen    schedule 31.05.2016
comment
Я не знаю, нужно ли мне сделать что-то еще, например, нужно ли сначала инициализировать getDefaultPeopleDetector () или что?   -  person HenryChen    schedule 31.05.2016
comment
#include <peopledetect.cpp>? Действительно ?   -  person Sunreef    schedule 31.05.2016
comment
извините, я просто не знаю, что делать, и я увидел, что getDefaultPeopleDetector () закодирован peopledetect.cpp, поэтому я включаю его ...   -  person HenryChen    schedule 31.05.2016
comment
Нет ... вы включаете h-файлы и компилируете .cpp как отдельный модуль.   -  person Martin James    schedule 31.05.2016
comment
удалите включение файла .cpp, какое сообщение об ошибке вы получите?   -  person Micka    schedule 31.05.2016
comment
если мы говорим об одном и том же peopledetect.cpp, нужная функция не определена там, а в включенном там заголовке ... Вероятно, у вас уже есть правильный заголовок (objdetect.hpp), поэтому просто удалите строку #include <peopledetect.cpp>   -  person Sunreef    schedule 31.05.2016
comment
хорошо, я удалил файл cpp, но ошибка все та же   -  person HenryChen    schedule 31.05.2016
comment
TL; DR. Я думаю, что свиньи довольно хорошо распознают людей, но я бы не стал особо полагаться на их способности к описанию.   -  person einpoklum    schedule 13.08.2016
comment
Это может вам помочь: geocities.ws/talh_davidc   -  person SomethingSomething    schedule 06.11.2016


Ответы (1)


В общем, вы никогда не должны включать файлы .cpp в программу на C ++. Для этого есть заголовки .h и .hpp.

Теперь, для вашей конкретной проблемы, если мы говорим об одном и том же peopledetect.cpp, функция, которую вы хотите, определена не там, а в включенном там заголовке ... У вас, вероятно, уже есть правильный заголовок (objdetect.hpp), так что просто удалить строку #include <peopledetect.cpp>

person Sunreef    schedule 31.05.2016
comment
но после удаления файла cpp ошибка все еще существует, что-то не так с моим форматом ввода? - person HenryChen; 31.05.2016
comment
Да это точно так же - person HenryChen; 31.05.2016
comment
используя getDefaultPeopleDetector (), мне вообще не нужно обучать какой-либо дескриптор, верно? - person HenryChen; 31.05.2016
comment
Я полагаю, вы уже знаете эту страницу так как вы скопировали туда код и добавили несколько ошибок. Подходит ли исходный код для вашей установки? - person Sunreef; 31.05.2016
comment
Ну, с той лишь разницей, что я использую opencv 2.4.13, а не 2.3, и на входе видео не с веб-камеры. - person HenryChen; 31.05.2016
comment
В документе OpenCV 2.4.13 класс HogDescriptor расположен в пространстве имен cv::ocl. Попробуйте вместо этого использовать ocl::HogDescriptor. - person Sunreef; 31.05.2016
comment
Кроме того, вы говорите, что ввод не с веб-камеры, но вы создаете объект VideoCapture с камерой по умолчанию ... @HenryChen - person Sunreef; 31.05.2016
comment
извините, я не понимаю вашу точку зрения, вы хотите оправдать эту строку: HOGDescriptor hog; to ocl :: HOGDescriptor hog; ? - person HenryChen; 31.05.2016