al072 1 Жалоба Опубликовано April 21, 2020 Доброго времени суток! Есть большой проект с распознаванием лиц который разрабатывался в Windows 7 + Visual Studio 2010, появилась задача мигрировать проект для дальнейшей разработки на Windows 10 + Visual Studio 2019. Миграция проекта прошла успешно, все основные функции и модули проекта работают, но есть одна проблема при попытке чтения CascadeClassifier из xml файла возникает ошибка: Вызвано исключение по адресу 0x79C8A5A9 (opencv_core2410.dll) в sdkDemo.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000001. Вот код при выполнении которого происходит исключение: void CsdkDemoDlg::initDetectors(CascadeClassifier &faceCascade) { // Load the Face Detection cascade classifier xml file. try { faceCascade.load("C:\\lbpcascade_frontalface.xml"); <<<<<<<-------Вот здесь вылетает ИСКЛЮЧЕНИЕ } catch (cv::Exception &e) {} } Библиотеки и инклуды все подключены как положено, проект компилируется и запускается без ошибок., при миграции проекта код программы не менялся, используется библиотека Open CV 2.4.1, при сборке на VS 2010 все работает без исключений... Помогите плиз найти проблему, готов предоставлять всю необходимую дополнительную информацию. Спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано April 21, 2020 Я бы собрал программу и OpenCV в Debug версии и глазами посмотрел, в чём ошибка. Или вставил логи в релизную версию OpenCV. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 22, 2020 (изменено) А рабочая папка правильно установлена ? Если бросить каскад в папку с ехешником и запустить отдельно. Тоже падает ? Изменено April 22, 2020 пользователем Smorodov Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
al072 1 Жалоба Опубликовано April 22, 2020 1 час назад, Smorodov сказал: А рабочая папка правильно установлена ? Если бросить каскад в папку с ехешником и запустить отдельно. Тоже падает ? Пробовал всяко разно и к переменной в коде путь к xml привязывать и абсолютный путь в формате "C:\\" задавал, падает сволочь., самое интересное что при сборке в VS 2010 все работает идеально.. 21 час назад, Nuzhny сказал: Я бы собрал программу и OpenCV в Debug версии и глазами посмотрел, в чём ошибка. Или вставил логи в релизную версию OpenCV. Собрал в Debug версии, пошел дебаггером гулять.. странно но в debag режиме я совсем в другом месте получаю debug Assertion после того как нажимаю кнопку повтор дальше вызов завершается на функции detectLargestObject в самом низу функции после строчки Return an Invalid rect , то есть крайнее условие If не выполняется, выполняется ветка else. void detectLargestObject(const Mat &img, CascadeClassifier &cascade, Rect &largestObject, int scaledWidth) { // Only search for just 1 object (the biggest in the image). int flags = CASCADE_FIND_BIGGEST_OBJECT;// | CASCADE_DO_ROUGH_SEARCH; // Smallest object size. Size minFeatureSize = Size(20, 20); // How detailed should the search be. Must be larger than 1.0. float searchScaleFactor = 1.1f; // How much the detections should be filtered out. This should depend on how bad false detections are to your system. // minNeighbors=2 means lots of good+bad detections, and minNeighbors=6 means only good detections are given but some are missed. int minNeighbors = 4; // Perform Object or Face Detection, looking for just 1 object (the biggest in the image). vector<Rect> objects; detectObjectsCustom(img, cascade, objects, scaledWidth, flags, minFeatureSize, searchScaleFactor, minNeighbors); if (objects.size() > 0) { // Return the only detected object. largestObject = (Rect)objects.at(0); } else { // Return an invalid rect. largestObject = Rect(-1,-1,-1,-1); } } дальше вот что вижу в студии: Если в Degug Assertion окне нажимаю другую кнопку продолжить, получаю следующее сообщение в студии: Господа как дальше быть то? подскажите плиз куда смотреть что копать еще можно Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 22, 2020 А если бряку поставить перед местом ошибки и вручную протопать и посмотреть вокруг ? На всякий случай прицепил каскады от моей версии, сейчас сам попробую загрузить у себя. UPD: прогнал у себя на коде: std::string cfname = "lbpcascade_frontalface.xml"; cv::CascadeClassifier faceCascade; faceCascade.load(cfname); Все без ошибок. Студия 2019, виндовс 10, opencv 4.2 . lbpcascade_frontalface.xml Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано April 23, 2020 Согласен, надо ставить breakpoint до падения, чтобы убедиться, что хотя бы каскад загружен и вообще почему падает. Не исключено, что в той версии OpenCV были ошибки или UB, а тут новый компилятор и они стрельнули. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
al072 1 Жалоба Опубликовано April 23, 2020 23 часа назад, Smorodov сказал: А если бряку поставить перед местом ошибки и вручную протопать и посмотреть вокруг ? На всякий случай прицепил каскады от моей версии, сейчас сам попробую загрузить у себя. UPD: прогнал у себя на коде: std::string cfname = "lbpcascade_frontalface.xml"; cv::CascadeClassifier faceCascade; faceCascade.load(cfname); Все без ошибок. Студия 2019, виндовс 10, opencv 4.2 . lbpcascade_frontalface.xml Спасибо за каскады, к сожалению не помогло! BP поставил везде где только можно было в радиусе этой ошибки, но без успешно... Не знаю на сколько глупость щас скажу, но может эта ошибка во время debug появляется по причине того что функция detectLargestObject не в основном потоке программы у меня крутится, а в отдельном потоке запускается... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 24, 2020 А попробуйте сделать минимальную программку из 3 строчек и посмотрите Так влияние окружения исключите. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
al072 1 Жалоба Опубликовано April 25, 2020 Всем большое спасибо за советы и помощь! Проблема решена. Пересобрал opencv c помощью CMake и VS2019 и все заработало... Бл столько времени убил, нужно было сразу с этого начинать Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах