Перейти к содержимому
Compvision.ru

Nuzhny

Пользователи
  • Количество публикаций

    1 427
  • Зарегистрирован

  • Посещение

  • Days Won

    176

Сообщения, опубликованные пользователем Nuzhny


  1. OpenCV 1.0 не поддерживает работу с несколькими камерами - сами разработчики на конференции Graphicon 2007 об этом говорили.

    Попробуй более новую версию библиотеки, возможно, что всё изменилось к лучшему.


  2. Вроде как OpenCV работает с камерой через DirectShow. Можно попробовать посмотреть изображение с камеры через graphedit и поиграть с настройками. Если получится получить нормальный видеопоток, то разбираться с OpenCV, иначе проблему следует искать в драйверах.


  3. Именно этой не пробовал. Однако недавно перенёс на CUDA свой детектор движения. На разрешении 720х576 работать стал быстрей раза в 4. Причём больше половины времени занимает конвертация кадра из RGB в RGBX и копирование его в видеопамять. То есть сама обработка ускорилась в 8 раз. Пока меня это устраивает, но в будущем, возможно, попробую разобраться и с этим.

    Плюс ко всему можно распаковку видео также перенести на видеокарту (в SDK пример есть), тогда процессор освободится ещё больше, а также не придётся копировать распакованный кадр в видеопамять.


  4. Если процессор хотя бы двухъядерный, то можно сделать 2 потока.

    Вариант 1.

    Первый поток выполняет только захват видео и копирует каждый кадр во второй поток, в котором будет производиться обработка.

    Во втором потоке должна быть выделена память на два кадра: в один копируется кадр из первого потока, второй обрабатывается. После обработки, указатели на кадры меняются местами. Копирование кадра и смену указателей необходимо защитить критической секцией.

    Вариант 2.

    Сделать очередь, в которую первый поток будет складывать захваченные кадры. Второй поток, соответственно, будет из неё читать и обрабатывать. Если размер очереди будет превышать некоторые разумные пределы (скажем 150 кадров), то выбрасывать кадры из очереди, но не подряд, а равномерно. Таким образом, пропадание кадров не приведёт к "дёрганию" картинки.

    Вариант 1 проще, его в принципе должно хватить. Вариант 2 применяется чаще всего при захвате видео из сети с низкой пропускной способностью, чтобы уменьшить эффект её латентности.


  5. Вообщем задача в следующем: необходимо в видеопотоке выделить автомобиль, пластину с автомобильным номером, сохранить эту пластину
    Самое простое - набрать в гугле plate recognition. Или походить по ссылкам в Википедии.

    Но у меня загвоздка в том что необходимо реализовать свои алгоритмы детектирования... То есть не использовать то, что реализовано в OpenCV...
    Ну так выкладывай свои алгоритмы, поможем реализовать.

  6. Возможно что то не так сделал... или у автора статьи OpenCV и IP Axis, по другому сделано.
    Скорее всего так и есть, а может у меня дома интернет-канал слишком узкий. На работе запустил из командной строки ffplay.exe "http://webcam.oii.ox.ac.uk/mjpg/video.mjpg" - показывает. ffplay.exe скачал с того же сайта, той же версии, которую подключал к OpenCV. Все исходники остались дома - попробовать на работе свой вариант смогу только в понедельник.

  7. 1. Скачал ffmpeg.

    2. Поправил в ffopencv.cpp подключаемые либы на те, которые есть в скачанной ffmpeg.

    3. В cvcap_ffmpeg.cpp исправил название функции с cvCreateFileCapture_FFMPEG на cvCaptureFromFile_FFMPEG.

    4. В свойствах проекта ffopencv -> C|C++ -> Preprocessor -> Preprocessor Definitions добавил HAVE_FFMPEG и HAVE_FFMPEG_SWSCALE

    5. Скомпилировал ffopencv

    6. Перекомпилировал проект highgui

    7. В своём проекте добавил инклуды ffopencv.h и _highgui.h, а также ffopencv.lib

    8. Вызываю CvCapture *capture = cvCaptureFromFile_FFMPEG("c:\\video\\The Big Bang Theory (Season 3)\\the.big.bang.theory.s03e06.720p.hdtv.x264-ctu.mkv"); - проигрывается!

    9. Все твои url с камерой нет.

    Вот.


  8. Вот сдесь: http://www.rainsoft.de/projects/ffmpeg_opencv.html пишут как включить поддержку FFMPEG в OpenCV, но под линукс(

    Угу. В папке otherlibs есть проект ffopencv, который и выдаёт необходимую ffopencv110.dll, в которой и есть интересующая функция cvCaptureFromFile_FFMPEG. Только для успешной компиляции надо скачать исходники ffmpeg, скомпилировать и получить либы: libavformat.a, libavcodec.a, libavutil.a, libgcc.a, libmingwex.a. Это линуксовые аналоги lib-файлов. Однако макросы _MSC_VER в ffopencv.cpp дают надежду на компиляцию под Виндой.

    Мне, если честно, неохота возиться с этим делом. Если будешь пробовать - расскажи о результатах.


  9. Кто ни будь пытался работать с IP камерами на С++?

    В OpenCV 1.1 есть cvCreateFileCapture_FFMPEG в _highgui.h, но он там закомментирован. Надо раскомментировать, перекомпилилировать highgui.dll. Посмотреть на ошибки линкера и попробовать с ними разобраться. У меня пока нет времени на это, может быть вечером.


  10. Наверняка можно и другой студией откомпилировать. У меня ещё стоит бета2 2010-й, могу попробовать. Но лучше тебе самому изучить тонкости компилирования и линковки (если, конечно, ты будешь работать С++ программистом).

    P.S. Посмотрел внимательней, у тебя ещё и cv.lib с cv110.dll лишние.


  11. Может быть что-то лишнее?

    Да, из них надо подключить только 3: cv.lib, cxcore.lib, highgui.lib. И, соответственно, брать с собой 3 dll: cv110.dll, cxcore110.dll, highgui110.dll.

    Твой код скомпилировал, вот здесь. В папке release лежит готовый exe и необходимые к нему 3 dll.


  12. Я наверное безнадежен=)

    Проделал все что вы сказали. Для каждого проекта сделал полную перекомпеляцию, но вот когда начинаю компелировать свой проект с опцией "Multi threaded", он мне выдает ошибку связанную с LINK. Что мы сделали поменяв настройку "Multi threaded"? Теперь к проекту нужно подключить dll?

    Нет, ничего подключать не нужно. Наоборот, все необходимые dll прилинкованы в виде статических библиотек (lib-файлов). Если бы ты назвал имя ошибки(ок), было бы проще тебе ответить. Unresolved external? Или, наоборот, always defined? В первом случае, надо добавить необходимые lib, во втором посмотреть в свойства линкера, вдруг в ignored input library указаны необходимые тебе библиотеки.

    Вообще, сборка больших С++ проектов довольно сложная задача из-за своей громоздкости (есть даже специальность - инженер по сборкам). Но процесс логичен и детерменирован, разрулить можно всегда. Ошибки в студию!


  13. Мда...) в одной функции memstorage был объявлен как статик :)

    Есть один рабочий, но немного извращенческий способ решения проблемы. Допустим, у тебя есть dll, которая не предназначена для многопоточного использования.

    1. Поставляешь с программой эту xxx.dll.

    2. Для каждого своего i-го потока создаёшь физическую копию этой длл: xxx_i.dll. Подключаешь её в этом потоке динамически (LoadLibrary и т.д), статическая линковка не подходит.

    3. Поток завершается, делается FreeLibrrary и xxx_i.dll удаляется с диска.

    По большому счёту ничего сложного, если нет желания править исходники библиотеки (или они могут быть недоступны), то такой подход вполне оправдан.

×