2014-02-14 1 views
0

Я пишу OpenCV на C++, который использует OpenCV, который захватывает кадры из нескольких видеоустройств, выполняет ряд преобразований на них, а затем создает новый кадр для отображения (в форме IplImage). Все это прекрасно работает.Как использовать собственный фильтр источника захвата в приложении на C++?

Затем я хочу создать экземпляр фильтра источника захвата и отправить ему эти кадры, чтобы создать виртуальное видеоустройство, которое можно использовать с такими программами, как Skype. Здесь у меня проблемы.

Я имел взгляд на VCam образец (источник захвата фильтра из here) Вивек, который, кажется, был бы идеальным, но я изо всех сил, чтобы выяснить, как изменить его, чтобы использовать в своем приложении:

  1. Vcam заполняет буфер случайными значениями, тогда как я хочу заполнить его данными из моего фрейма.

  2. VCam производит DLL-файл, который должен быть зарегистрирован до создания фильтра, но я хочу, чтобы создать фильтр при запуске моего приложения, а затем удалить его, когда он заканчивается

Я совершенно новый для DirectShow, и только несколько месяцев программируются на C++, поэтому я над этим перехожу. Может ли кто-нибудь описать шаги, которые мне нужно предпринять, чтобы реализовать эти два изменения выше?

Спасибо, Phil

ответ

1

Ваши вопросы несколько пространных конкретного ответа.

Vcam заполняет буфер случайными значениями, тогда как я хочу заполнить его данными из моего кадра.

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

VCam производит DLL-файл, который должен быть зарегистрирован до создания фильтра, но я хочу, чтобы создать фильтр при запуске моего приложения, а затем удалить его, когда он заканчивается

Это не как он должен работать. Я предполагаю, что вам нужен этот фильтр, потому что вы хотите интегрироваться с другим программным обеспечением, которое ищет доступные «камеры», видеоисточники. И вы хотите сделать свой собственный доступ как таковой. Этот трюк требует, чтобы вы зарегистрировали свою камеру, и тогда вы, вероятно, позаботитесь о межпроцессной связи, потому что источник будет размещен другим процессом, и вы каким-то образом передадите свои данные.

Это требует, чтобы вы полностью регистрировали ваш источник как автономное устройство с возможностями принимать данные из вашего приложения и передавать его дальше с помощью стандартного API и быть внутренне осведомленным о межпроцессной связи. Конечно, вы можете снять его (отменить регистрацию), когда ваше приложение прекратится. Я полагаю, вы недооцениваете поток данных, о которых вам придется позаботиться.