Доступ к нарушению чтения местоположения при push_back Mat в другом Mat - PullRequest
0 голосов
/ 10 марта 2019

Я хочу написать простой код для извлечения функций HOG, а затем обучить SVM.но это исключение происходит, я пробую разные версии OpenCV, такие как 3.4.5 и 4.0, но они не отличаются.

cv::HOGDescriptor hogDetector = cv::HOGDescriptor();
    hogDetector.winSize = cv::Size(256, 256);
    hogDetector.blockSize = cv::Size(64, 64);
    hogDetector.blockStride = cv::Size(192, 192);
    hogDetector.cellSize = cv::Size(32, 32);

и функции возврата HOG:

cv::Mat computeHOG(cv::Mat img)
{
    std::vector<float> descriptors;
    std::vector<cv::Point> locations;
    hogDetector.compute(img, descriptors, cv::Size(8, 8), cv::Size(0, 0), locations);
    cv::Mat row = cv::Mat(descriptors);
    return row;
}

и основной код для функций извлечения:

cv::Mat trainFeatures;
cv::Mat trainLables;
while (!PFile.eof())
    {
        std::string name; std::getline(PFile, name);
        std::vector<std::string> parts = splitString(name, ' ');
        cv::Mat img = cv::imread(basePath + parts[0]);
        cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);
        cv::resize(img, img,cv::Size(1250, 320));
        cv::Mat f = computeHOG(img);
        trainFeatures.push_back(f);
        trainLables.push_back(std::stoi(parts[1]));
    }

исключение происходит в строке: trainFeatures.push_back(f);, а f форма равна 1 * 1 * 162000

полное исключение:

Exception thrown at 0x00007FFF5A9C17E5 (opencv_world345d.dll) in vehicleRecognition.exe: 0xC0000005: Access violation reading location 0x000002A830658140.

1 Ответ

1 голос
/ 10 марта 2019

в отладке я обнаружил, что f Mat (функции HOG) - это FLOAT32, но trainFeatures - UINT8, сначала я изменяю cv::Mat trainFeatures; на cv::Mat trainFeatures = cv::Mat1f();, но не различаюсь, и снова меняю его на cv::Mat trainFeatures = cv::Mat(1, 162000,CV_32FC1); и работаю, исправлена ​​ошибка.а также измените строку на: row = row.reshape(1, 1);

Я не знаю, почему исправлена ​​проблема, и странно, почему OpenCV автоматически не может обнаружить ее.если у вас есть лучшее решение, напишите это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...