Jump to content
Compvision.ru

al072

Пользователи
  • Content count

    59
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by al072

  1. Добрый день! Коллеги, подскажите пожалуйста при помощи каких codec можно уменьшить размер выходного видео файла? Задача получить минимальный размер при сохранении среднего качества картинки получаемой с Web камеры. Перепробовал различные комбинации кодеков/выходного формата: 'M', 'J', 'P', 'G' / .avi , 'M', 'P, '4', 'V' / .mp4 , 'D', 'I', 'V', 'X' / .avi , 'A', 'V', 'C', '1' / .avi . На данный момент 30 минут видео с 10 FPS весит > 1GB, в идеале хотелось бы добиться 200-300 мбайт. Вот код функции с помощью которого пишу видео файл с web камеры: int fcc = CV_FOURCC('M', 'J', 'P', 'G'); int fps = 25; string filelocation = "С:\\video.avi"; cv::Size frameSize(videoCapture.get(CV_CAP_PROP_FRAME_WIDTH), videoCapture.get(CV_CAP_PROP_FRAME_HEIGHT)); VideoWriter testwriter(filelocation, fcc, fps, cv::Size(640,480), true); while (true) { cv::Mat writefrm; //Get frame from webcam videoCapture >> writefrm; }
  2. Не заработал.. пробовал выбрать выходные форматы: .mkv и .avi Первый даже файл не создался., второй 0 байт
  3. Пробовал выставлять в настройках H.264 +avi; H.264 + mkv, H.264 + mp4 , но почему-то не одна из этих связок кодек+формат не захотела записывать файл . Для H.264 нужно специальные кодеки на ПК ставить или этот кодек как MJPG по умолчанию в винде есть? Может есть какие либо более достойные альтернативы VideoWriter? Больно уж этот класс скудный , может конечно в более свежих сборках OpenCV его допилили и доработали, но я использую версию 2.4.1 и как то совсем не весело., особенно огорчил метод VideoWriter::release(); С многопоточностью он походу дружит слабо, либо вообще не дружит.. при запуске в boost::thread метод показал крайне не стабильную работу через раз записывал файл, вызывал завершение программы, пришлось синхронизировать потоки и танцевать с mutex
  4. Всем большое спасибо за советы и помощь! Проблема решена. Пересобрал opencv c помощью CMake и VS2019 и все заработало... Бл столько времени убил, нужно было сразу с этого начинать
  5. Доброго времени суток! Есть большой проект с распознаванием лиц который разрабатывался в 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 все работает без исключений... Помогите плиз найти проблему, готов предоставлять всю необходимую дополнительную информацию. Спасибо.
  6. Спасибо за каскады, к сожалению не помогло! BP поставил везде где только можно было в радиусе этой ошибки, но без успешно... Не знаю на сколько глупость щас скажу, но может эта ошибка во время debug появляется по причине того что функция detectLargestObject не в основном потоке программы у меня крутится, а в отдельном потоке запускается...
  7. Пробовал всяко разно и к переменной в коде путь к xml привязывать и абсолютный путь в формате "C:\\" задавал, падает сволочь., самое интересное что при сборке в VS 2010 все работает идеально.. Собрал в 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 окне нажимаю другую кнопку продолжить, получаю следующее сообщение в студии: Господа как дальше быть то? подскажите плиз куда смотреть что копать еще можно
  8. Добрый день! Подскажите пожалуйста как лучше реализовать обнаружение нескольких различных предметов на одном изображении? мы используем классификатор обнаружения лица "lbpcascade_frontalface.xml" и умеем обнаруживать лицо на изображении, и допустим у нас есть еще несколько различных классификаторов "собаки.xml", "кошки.xml", "сигареты.xml" и т.д. как можно реализовать обнаружение всех этих классификаторов на одном изображении одновременно ? какой алгоритм или подход лучше использовать? Программу реализуем на opencv 2.4.1 (C++) заранее большое спасибо всем кто откликнется.
  9. Спасибо господа! Понял куда нужно копать
  10. Analog video capture device

    Доброго времени суток! Господа прошу помочь выбрать устройство для преобразования аналогового видеосигнала в цифровой для использования в проекте opencv. Рассматриваю вот это устройство: http://s.aliexpress.com/ZZFnYvu6 Но судя по информации в интернете и на форуме opencv никому так и не удалось подружить этот граббер с opencv. Если кто-нибудь сталкивался с подобной задачей поделитесь опытом плиз.
  11. Analog video capture device

    Уважаемые форумчане! Откликнитесь плиз! Может не понятна суть вопроса?
  12. HBitmap to cvMat

    Добрый день! Спасибо за пример кода. Подскажите пожалуйста какой HDC нужно передавать в функцию и как его создать?
  13. Всем добрый день! Подскажите плиз с помощью каких средств можно сократить время цикла распознавания лиц? Если быть точнее, то необходимо оптимизировать работу функции model->predict(); При добавлении более 100 лиц в модель, время затрачиваемое на определение лица и присваивание метки увеличивается кратно 1 лицо 1 мс, таким образом получается что если искать совпадение в модели которая имеет порядка 200 лиц, в среднем на один цикл распознавания затрачивается 150 мс, из-за этого видеопоток начинает тормозить. 1) подскажите какой метод наиболее эффективно использовать? TBB, OpenMP, GPU или есть чтото более оптимальное? 2) можно ли распараллелить работу функции model->predict()? Модель создается с помощью createLBPHFaceRecognizer().
  14. Я это понимаю, просто нужна помощь в синхронизации потоков и совет по оптимизации обработки изображения. Также пока не понятно необходимо ли реализовывать очередь и поможет ли она ускорить процесс распознавания?
  15. Я бы с радостью загнал все в один поток и радовался жизни, но вот только не знаю каким образом оптимизировать самую прожерливую функцию которая обрабатывает входное изображение (как я ранее писал она занимает порядка 45 миллисекунд). Пробовал оборачивать эту функцию в #pragma omp parallel, но результатов это не дало только стало еще хуже.. Можете помочь с примером кода или чуть подробней расписать как реализовать очереди кадров? Если я правильно понял из ваших комментариев, то мне необходимо два потока, в одном потоке я получаю изображения с камеры и запихиваю их в очередь изображений и в этом же потоке я должен создать очередь для вывода изображений: 1) как сделать очередь изображений и очередь вывода и есть ли в этом смысл? Если функция proccessFrame в любом случае занимает не менее 45 миллисекунд, то следовательно очередь вывода будет пополняться не ранее чем через 45 миллисекунд. То есть никакой оптимизации по времени мы не получим правильно? 2) куда расставлять mutex? 3) как синхронизировать потоки? Извиняюсь за кучу вопросов, с потоками вообще раньше не работал.. Для реализации потоков прикрутил boost к проекту.
  16. Господа, подскажите плиз как правильнее реализовать работу потоков и оптимизировать работу программы. Имеется 4 основных процесса: 1) Получение изображения с камеры (занимает 2-3 миллисекунды); Полученное изображение записывается в cv::Mat Frame; 2) Обработка изображения (занимает 45 миллисекунд); Обработанное изображение записывается в cv::Mat processedFrame; 3) Распознавание занимает (от 5 - 40 миллисекунд в зависимости от колличества лиц и меток в базисе); 4) Вывод изображения на форму занимает (2 миллисекунды). Если запускать все четыре процесса паралленьно каждый в своем потоке, то получается что возникает необходимость синхронизировать 1,2,3,4 потоки последовательно, и смысл в многопоточности теряется. То есть пока не завершен 1 процесс получения кадра, нет смысла запускать 2 процесс обработки этого кадра, пока кадр не обработан, нет смысла выполнять функцию 3 распознавания и соответственно выводить изображение на форму 4. Подскажите каким образом можно оптимизировать работу потоков и как добиться сокращения времени работы цикла начиная от получения изображения до вывода его на форму? То есть изначально все четыре процесса 1,2,3,4 я запускал в одном потоке и это занимало 50-150 миллисекунд в зависимости от количества лиц и меток. Сейчас я запускаю эти 4 процесса каждый в своем потоке, но скорость вывода изображения на форму от этого не меняется, более того появляется еще больше геморроя с синхронизацией работы потоков..
  17. http://stackoverflow.com/questions/19857263/how-to-activate-c11-standard-in-visual-studio-2010 https://habrahabr.ru/post/173639/ Пишут что C++11 частично реализован в VS2010, и согласно таблицы сравнения версий. thread поддерживается начиная с 2012/2013. Вообщем boost мне в руки))
  18. Тестировал Eigen,Fisher, LBPH на 10 людях (по 30 лиц на каждого). Пробовал разные настройки threshold, при различной освещенностью, самый стабильный результат определения добился с помощью LPBH. А у вас какие результаты? какими алгоритмами пользуетесь? Я использую VS2010, #include <thread> такого хидера я не нашел, если я правильно понимаю то std::thread в VS2010 не доступен? То есть данная библиотека доступна начиная с VS2012 (поправьте если я не прав). Посмотрел код по ссылке на stackoverflow, думаю что-то подобное мне и нужно. Для того чтобы не было тормозов необходимо обрабатывать загрузку фреймов, обработку и определение в разных threads. То есть я так понимаю нужен threads pool который должен параллельно запускать 3 threads и синхронизировать их работу. Пытался реализовать этот механизм с помощью DWORD WINAPI, но не хватает познаний в многопоточном программировании. С boost раньше не работал, но надеюсь там будет проще это реализовать.. Если всетаки у кого есть примеры как сделать подобный механизм на WINAPI просьба поделитесь..
  19. В первую очередь спасибо за потраченное время на развернутый ответ! 1) С проблемой "плывет изображение" наконец удалось разобраться. Решение отписал в соответствующей ветке; 2) С openMP я понял что не все так просто как хотелось бы. Думал добавлю параллельные директивы и все залетает, но не тут то было. 3) Вместо EigenFace , в данный момент использую LBPH, на мой взгляд он более стабильно определяет дистанцию. Каким образом можно обновлять базис для LPBH? По такому же принципу как и Eigen? 4) Застрял на реализации ThreadPool. Может ктонибудь помочь разобраться как из основного потока DWORD WINAPI ThreadMain запускать отдельный поток для обработки predict()? И как синхронизировать эти потоки?
  20. Всем доброго времени суток! Столкнулся с проблемой. Тестирую код из книги Mastering OpenCV глава 8. И не пойму по какой причине видео с вебкамеры начинает тормозить (задержка примерно 3 сек) и искажаться через определенное время (10-30 сек) после запуска режима распознавания лица. То есть в режимах когда идет сбор лиц или просто режим определения, картинка не тормозит и не искажается, но как только включаю режим распознавания лица начинаются проблемы (файл прикрепил). 1) Пробовал запихать цикл распознавания в таймер. не помогло. 2) Пробовал запускать в отдельном потоке (выставлял разные Sleep(1-30)). не помогло. 3) Пробовал выводить изображение как через функцию imshow, так и на форму (MFC C++), тоже не дало результатов. 4) Утечка памяти замечена не была. Если кто-нибудь сталкивался с подобной проблемой, подскажите плиз как ее решить?
  21. Плывет изображение

    Может кому пригодиться! Победил проблему искажения изображения путем подбора кодеков (переустановил драйвера на видеокарту + поставил K-Lite Mega codec pack с настройками под ffmpeg). Также в настройках самой камеры понизил Key Frame interval с 60 до 30. Снизил BitRate до 512.
  22. В исходниках функции predict() не нашел никакого параллельного кода. Перестроил проект с флагом /openmp и добавил заголовок #include <omp.h>. Далее сравнил результаты работы функции: Для 150 лиц время работы составило: 20-25 милисекунд model->predict(preprocessedFace, label, confidence); Для 150 лиц время работы составило: 60-65 милисекунд #pragma omp parallel { model->predict(preprocessedFace, label, confidence); } То есть с использованием openMP стало еще хуже. В чем может быть проблема? Что делаю не так?
  23. Всем спасибо. Буду читать изучать тестировать. Результат сообщу.
  24. Ок. Покопаю исходники метода predict(). То есть если в исходниках метод не распараллелен, мне необходимо править исходники и перестраивать библиотеки и либы? Что тогда делает опция "WITH TBB" в CMake? Извиняюсь за кучу вопросов. Пока каша в голове.
  25. Ok. Как убедиться что tbb подключен к библиотеке? Если cv::parallel_for_ , доступен в пространстве имен cv, значит библиотека собрана с поддержкой TBB? Проще говоря в скачанной с офф сайта библиотеке OpenCV 2.4.11 уже есть поддержка TBB? Следующий вопрос каким образом распараллелить работу метода model->predict(newface,lables,distance); ? Допустим есть класс который работает с TBB: class Parallel_process : public cv::ParallelLoopBody { private: public: Parallel_process() virtual void operator()(const cv::Range& range) const { for(int i = range.start; i < range.end; i++) { } } }; Как с помощью этого кода распараллелить работу метода predict()? Спасибо.
×