Jump to content
Compvision.ru

al072

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

    59
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by al072


  1. 43 минуты назад, Smorodov сказал:

    Думается H.264 или H.265 должны жать по максимуму, но вряд ли сильно плотнее чем mpeg4 или divX.. 

    Пробовал выставлять в настройках H.264 +avi; H.264 + mkv, H.264 + mp4 , но почему-то не одна из этих связок кодек+формат не захотела записывать файл . Для H.264 нужно специальные кодеки на ПК ставить или этот кодек как MJPG по умолчанию в винде есть?

    Может есть какие либо более достойные альтернативы VideoWriter? Больно уж этот класс скудный , может конечно в более свежих сборках OpenCV его допилили и доработали, но я использую версию 2.4.1 и как то совсем не весело., особенно огорчил метод VideoWriter::release(); С многопоточностью он походу дружит слабо, либо вообще не дружит.. при запуске в boost::thread метод показал крайне не стабильную работу через раз записывал файл, вызывал завершение программы, пришлось синхронизировать потоки и танцевать с mutex 


  2. Добрый день! Коллеги, подскажите пожалуйста при помощи каких 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;
        }

     


  3. 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 не в основном потоке программы у меня крутится, а в отдельном потоке запускается...

     


  4. 1 час назад, Smorodov сказал:

    А рабочая папка правильно установлена ? Если бросить каскад в папку с ехешником и запустить отдельно. Тоже падает ?

    Пробовал всяко разно и к переменной в коде путь к xml привязывать и абсолютный путь в формате "C:\\" задавал, падает сволочь., самое интересное что при сборке в VS 2010 все работает идеально..

     

    21 час назад, Nuzhny сказал:

    Я бы собрал программу и OpenCV в Debug версии и глазами посмотрел, в чём ошибка. Или вставил логи в релизную версию OpenCV.

    Собрал в Debug версии, пошел дебаггером гулять.. странно но в debag режиме я совсем в другом месте получаю debug Assertion

    5ea06cffacb81_.PNG.a5b4563c9eaf025333f899038e2250a4.PNG

    после того как нажимаю кнопку повтор дальше вызов завершается на функции 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);
        }
    }

    дальше вот что вижу в студии:

    5ea06f7641313_.thumb.png.266184917810938e71570cfb9aed8f19.png

    Если в Degug Assertion окне нажимаю другую кнопку продолжить, получаю следующее сообщение в студии:

    5ea0703d45924_2.thumb.png.ea37839668a2193c373a5b7969ba7794.png

    Господа как дальше быть то? подскажите плиз куда смотреть что копать еще можно 


  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. Добрый день! Подскажите пожалуйста как лучше реализовать обнаружение нескольких различных предметов на одном изображении?

    мы используем классификатор обнаружения лица "lbpcascade_frontalface.xml" и умеем обнаруживать лицо на изображении, и допустим у нас есть еще несколько различных классификаторов "собаки.xml", "кошки.xml", "сигареты.xml" и т.д. 

    как можно реализовать обнаружение всех этих классификаторов на одном изображении одновременно ? какой алгоритм или подход лучше использовать?

    Программу реализуем на opencv 2.4.1 (C++) 

    заранее большое спасибо всем кто откликнется.

     

    1.thumb.png.efc643dac4f6f24c0cef7de82ef87b94.png


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

    Но судя по информации в интернете и на форуме opencv никому так и не удалось подружить этот граббер с opencv. Если кто-нибудь сталкивался с подобной задачей поделитесь опытом плиз.


  8. Я это понимаю, просто нужна помощь в синхронизации потоков и совет по оптимизации обработки изображения. Также пока не понятно необходимо ли реализовывать очередь и поможет ли она ускорить процесс распознавания?


  9. Я бы с радостью загнал все в один поток и радовался жизни, но вот только не знаю каким образом оптимизировать самую прожерливую функцию которая обрабатывает входное изображение (как я ранее писал она занимает порядка 45 миллисекунд). Пробовал оборачивать эту функцию в #pragma omp parallel, но результатов это не дало только стало еще хуже..

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

    Если я правильно понял из ваших комментариев, то мне необходимо два потока, в одном потоке я получаю изображения с камеры и запихиваю их в очередь  изображений и в этом же потоке я должен создать очередь для вывода изображений:

    Цитата

     

    cv::Mat frame; // необработанное изображение с камеры

    cv::Mat processedframe;// обработанное изображение

    void GUIня()

    {

         while(true)

         {

                  frame = getFrame();// получаем изображение с камеры

                  FrameQuie(proccessedframe);// добавляем в очередь 

                  ShowFromQuie(FrameQuie);// выводим из очереди

                  Sleep(1);

         }

    }

    void proccessFrame()

    {

         while(true)

         {

                processedframe = Processframe(frame);//Обработка

                Sleep(1);

         }

    }

    boost::thread thrd1(&GUIня,this);

    boost::thread thrd2 (&proccessFrame,this);

     

    1) как сделать очередь изображений и очередь вывода и есть ли в этом смысл? Если функция proccessFrame в любом случае занимает не менее 45 миллисекунд, то следовательно очередь вывода будет пополняться не ранее чем через 45 миллисекунд. То есть никакой оптимизации по времени мы не получим правильно?

    2) куда расставлять mutex?

    3) как синхронизировать потоки?

    Извиняюсь за кучу вопросов, с потоками вообще раньше не работал.. Для реализации потоков прикрутил boost к проекту.


  10. Господа, подскажите плиз как правильнее реализовать работу потоков и оптимизировать работу программы. Имеется 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 процесса каждый в своем потоке, но скорость вывода изображения на форму от этого не меняется, более того появляется еще больше геморроя с синхронизацией работы потоков.. 


  11. 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 мне в руки))


  12. 7 часов назад, mrgloom said:

    LBPH::train

    https://github.com/bytefish/libfacerec/blob/0342be1453ea7689f40b3c1b9e2253446627f2f1/src/facerec.cpp

    идет вычисление LBP из него spartial histogram и кладется в _histograms, т.е. базис не строится и на него проецировать не надо, просто вычисляются фичи.

    p.s. а что LBPH работает лучше всего?

    кстати можно делать PCA не на базе пикселей изображения, а на базе LBP, не факт что будет лучше, но сжать вектор фич получится.

     

     

    по поводу потоков что то такое (код не смотрел)

    http://stackoverflow.com/questions/27661353/opencv-camera-capture-from-within-a-thread

    Если есть современный компилятор >VS2010, gcc>4.6 то можно использвать std::thread, если нет то тогда boost.

     

    Тестировал Eigen,Fisher, LBPH на 10 людях (по 30 лиц на каждого). Пробовал разные настройки threshold, при различной освещенностью, самый стабильный результат определения добился с помощью LPBH. А у вас какие результаты? какими алгоритмами пользуетесь?

    Я использую VS2010, #include <thread> такого хидера я не нашел, если я правильно понимаю то std::thread в VS2010 не доступен? То есть данная библиотека доступна начиная с VS2012 (поправьте если я не прав). 

    Посмотрел код по ссылке на stackoverflow, думаю что-то подобное мне и нужно. Для того чтобы не было тормозов необходимо обрабатывать загрузку фреймов, обработку и определение в разных threads. То есть я так понимаю нужен threads pool который должен параллельно запускать 3 threads и синхронизировать их работу. Пытался реализовать этот механизм с помощью DWORD WINAPI, но не хватает познаний в многопоточном программировании. С boost раньше не работал, но надеюсь там будет проще это реализовать.. 

    Если всетаки у кого есть примеры как сделать подобный механизм на WINAPI просьба поделитесь.. 


  13. В первую очередь спасибо за потраченное время на развернутый ответ!

    1) С проблемой "плывет изображение" наконец удалось разобраться. Решение отписал в соответствующей ветке;

    2) С openMP я понял что не все так просто как хотелось бы. Думал добавлю параллельные директивы и все залетает, но не тут то было.

    3) Вместо  EigenFace , в данный момент использую LBPH, на мой взгляд он более стабильно определяет дистанцию. Каким образом можно обновлять базис для LPBH? По такому же принципу как и Eigen?

    4) Застрял на реализации ThreadPool. Может ктонибудь помочь разобраться как из основного потока DWORD WINAPI ThreadMain запускать отдельный поток для обработки predict()? И как синхронизировать эти потоки?

     


  14. Может кому пригодиться! Победил проблему искажения изображения путем подбора кодеков (переустановил драйвера на видеокарту + поставил K-Lite Mega codec pack с настройками под ffmpeg). Также в настройках самой камеры понизил Key Frame interval с 60 до 30. Снизил BitRate до 512. 

    • Like 1

  15. В исходниках функции 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 стало еще хуже. В чем может быть проблема? Что делаю не так?


  16. Ок. Покопаю исходники метода predict().

    То есть если в исходниках метод не распараллелен, мне необходимо править исходники  и перестраивать библиотеки и либы? Что тогда делает опция "WITH TBB" в CMake? Извиняюсь за кучу вопросов. Пока каша в голове.


  17. 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()? Спасибо.


  18. Nuzhny, понял. Как на счет TBB. Есть шансы?

    Поддержка TBB в opencv 2.4.11 есть по умолчанию или необходимо както подключать TBB дополнительно?

    Запустил конфигуратор CMake. и после конфигурации увидел поддержку OpenCL.

    Other third-party libraries:

    Use IPP: NO

    Use Eigen: NO

    Use TBB: YES (ver 4.4 interface 9002)

    Use OpenMP: NO

    Use GCD NO

    Use Concurrency NO

    Use C=: NO

    Use Cuda: NO

    Use OpenCL: YES

     

    OpenCL:

    Version: dynamic

    Include path: C:/Program Files/OpenCV 2.4.1/opencv/sources/3rdparty/include/opencl/1.2

    Use AMD FFT: NO

    Use AMD BLAS: NO

    Значит ли это что есть шанс завести OpenCL или данная информация не о чем не говорит?

×