Проект написан на VC++ в .NET с использованием DirectShow.
Получаю с WEB камеры изображение и вывожу его в окно (Panel) через VMR9.
Задача:
Необходимо в это же окно поверх изображения выводить какую либо служебную информацию
в виде текста (в частном случае) или прямоугольника, который можно бы было таскать
мышкой, изменяя его размеры и положение.
Пока изображения с камеры нет, в этом окне получается нарисовать что угодно,
но как только начинает идти изображение, оно закрывает собой все нарисованное.
Эту информацию никуда записывать не нужно, надо просто отобразить
ее в этом окне, причем не зависимо от того, поступает ли видео с камеры или нет
(это я заранее превентирую советы реализовать это средствами DirectShow).
Пересмотрел массу подобных вопросов на этом и других форумах, но к сожалению,
ничего подходящего не нашел.
Буду благодарен за любую помощь.
Здравствуйте, Beketata, Вы писали:
B>Исходные данные:
B>Задача:
B> Необходимо в это же окно поверх изображения выводить какую либо служебную информацию B>в виде текста (в частном случае) или прямоугольника, который можно бы было таскать B>мышкой, изменяя его размеры и положение. B>Пока изображения с камеры нет, в этом окне получается нарисовать что угодно, B>но как только начинает идти изображение, оно закрывает собой все нарисованное.
Ок, давайте разбираться ... если Вs выводите при помощи DS VMR9 то он скорее всего (обратное скорее исключение чем правило) работает в оверлее, а наложение буфера кадра на прямоугольник заполненный ключевым цветом происходит суть ли не в конце процесса формирования полного буфера кадра экрана непосредственно в виделкарте — чем собственно и объясняется величина быстродействие при рендеринге в YUV форматах (ну и не только этим ... ) таким образом как я понимаю Ваш текст просто затирается самим прямоугольником кадра, на вскидку могу предложить такое решение — содавать кадр вручную и кормить им ещё один пин VMR9 причём настроить так что бы он смешивал определённым образом кадры вашего видео и кадр который вы ему предлагаете так что бы от "информационнногог кадра" оставался только текст ... собственно ... возможно придётся реализовать частичную функциональность фильтра а возможно и просто его написать ... например такой что вы ему подсовываете картинку а он из неё делает видео ...
А ещё можно использовать Microsoft DirectX 9.0 (а может и не только 9, другого под рукой нет) : Filter Samples : RGB Filters Sample — какой-нить ... .ну если его например переделать под YUV то будет немного проще ... или наоборот сложнее ....
Здравствуйте, _INDY_, Вы писали:
B> ... на вскидку могу предложить такое решение — содавать кадр вручную и кормить им B> ещё один пин VMR9 причём настроить так что бы он смешивал определённым образом кадры B> вашего видео и кадр который ...
В свой Source фильтр уже имплементирован OSD интерфейс, через который можно накладывать текст на изображение. Так что основная проблема не с текстом, а с прямоугольной рамкой, с помощью которой необходимо выделять произвольную область в кадре. И очень не хочется рисовать ее через какой ни будь из фильтров, тем более, что видео потока из камеры в данный момент может и не быть. Но даже только для текста выводить его средствами .NET, когда видео потока нет и через фильтр, когда он есть — как то не с руки.
Одним словом, если уж UI пишется на .NET (или с помощью любого другого средства), то все пользовательские прибамбахи типа рисования этой рамки хотелось бы реализовать именно в нем не внедряясь ни в какие фильтры. Конечно, координаты рамки необходимо будет передать в Source фильтр, но само ее рисование очень логично сделать в программе, которая этот фильтр использует. А так получается, что я должен буду перенести часть пользовательского интерфейса внутрь фильтра, что ему вовсе не свойственно.
Провел такой эксперимент с VMR7. Вывожу в одной программе видео из двух файлов в два окна. При этом в первом окне VMR7 работает через оверлей и вот в нем удается рисовать поверх изображения, а во втором окне, где оверлей не включен, изображение затирает все нарисованное.
Почему то в случае с VMR9 оверлей у меня не включается ни в одном окне. Но даже если бы и включился, мне это все равно не помогает, т.к. окон у меня несколько.
Причем интересно, если поместить на контрол (Panel в моем случае) в который выводится изображение, например Button или Label, то они всегда остаются поверх видео изображения.
Отсюда возникает вопрос: каким образом рисуются эти контролы, что им удается перекрыть собой видео?
Дальнейшие поиски привели сюда: www.gotdotnet.ru/DotNet/FAQ/WindowsForms/Misc/28812.aspx
Этим методом и воспользовался. Правда текст получается корявый, в точности как в OSD в программе LightAlloy (довольно популярный проигрыватель видео), видимо там эта проблема решена таким же способом. А с рамкой все OK.
Здравствуйте, Beketata, Вы писали:
B>Исходные данные:
B> Проект написан на VC++ в .NET с использованием DirectShow. B>Получаю с WEB камеры изображение и вывожу его в окно (Panel) через VMR9.
B>Задача:
B> Необходимо в это же окно поверх изображения выводить какую либо служебную информацию B>в виде текста (в частном случае) или прямоугольника, который можно бы было таскать B>мышкой, изменяя его размеры и положение.
можно выводить эту информация на бимпаку которую потом устанавливать(с прозрачным фоном) поверх видео с помощью IVMRMixerBitmap9
C> можно выводить эту информация на бимпаку которую потом устанавливать(с прозрачным фоном) C> поверх видео с помощью IVMRMixerBitmap9
Хотелось бы провести границу между GUI и тем, для чего он собственно создается.
Я уже писал, что в своем Source фильте реализован OSD для вывода текста поверх изображения. Можно дополнить его рисованием всемозможных примитивов. Но это не выход из положения. Во-первых, видеопотока из камеры может и не быть, а во-вторых, даже если он есть, то из WEB камеры кадры могут ехать со скоростью, например, 1 FPS. И если я вдруг захочу мышкой изменить размеры прямоугольника детектора движения в кадре, а его перерисовка будет происходить раз в секунду ...
Так же не поможет и IVMRMixerBitmap9, т.к кадры не удасться выводить чаще, чем они поступают из камеры.
Функциональность, которая требовалась от Source фильтра реализована — это работа с WEB камерой.
А создавать из DS фильтров VisualStudio это не наш метод.
Я пишу пользовательский интерфейс на NET ТОЛЬКО с той целью, чтобы избежать создания этих самых "бимпаков", а пользовоться набором существующих компонентов, функциональности которых, к сожалению, не хватает. Но мы имеем то, что имеем.
Вот, например, при момещении на форму любого другого контрола он закрывает собой видео (чего и требуется) и поэтому приходится извращаться со свойством Region у UserControl-а. Но у UserControl-а нет сойства Opacity для регулирования прозрачности, а хотелось бы ее использовать. А вот например, у ContextMenuStrip-а (контекстное меню) есть такое свойство. Понимаю, что оно TopMost, как и форма, у которой тоже есть Opacity, но от этого не легче.
Здравствуйте, Beketata, Вы писали:
B> Хотелось бы провести границу между GUI и тем, для чего он собственно создается.
так это как
так и выходит — гуи, расчетная часть, рендерег. Расчетная часть указывает рендерегу где и что рисовать, и в гуи ничто не попадает
B>...Во-первых, видеопотока из камеры может и не быть, а во-вторых, даже если он есть, то из WEB камеры кадры могут ехать со скоростью, например, 1 FPS. И если я вдруг захочу мышкой изменить размеры прямоугольника детектора движения в кадре, а его перерисовка будет происходить раз в секунду ... B> Так же не поможет и IVMRMixerBitmap9, т.к кадры не удасться выводить чаще, чем они поступают из камеры.
можно использовать IVMRWindowlessControl->RepaintVideo и обновить изображение не дожидаясь следующего кадра
этого должно хватить для решения поставленой задачи, писать фильтр для рисования по видео можно, но это намного сложнее чем наложить нужное изображение с помощью IVMRMixerBitmap9
Здравствуйте, Beketata, Вы писали:
B>Исходные данные:
B> Проект написан на VC++ в .NET с использованием DirectShow. B>Получаю с WEB камеры изображение и вывожу его в окно (Panel) через VMR9.
B>Задача:
B> Необходимо в это же окно поверх изображения выводить какую либо служебную информацию B>в виде текста (в частном случае) или прямоугольника, который можно бы было таскать B>мышкой, изменяя его размеры и положение. B>Пока изображения с камеры нет, в этом окне получается нарисовать что угодно, B>но как только начинает идти изображение, оно закрывает собой все нарисованное. B> Эту информацию никуда записывать не нужно, надо просто отобразить B>ее в этом окне, причем не зависимо от того, поступает ли видео с камеры или нет B>(это я заранее превентирую советы реализовать это средствами DirectShow).
B>Пересмотрел массу подобных вопросов на этом и других форумах, но к сожалению, B>ничего подходящего не нашел. B>Буду благодарен за любую помощь.
То что ты хочешь сделать, можно толко на софтверном рендере, а это доработка фильтра рендера, по моему чтото идет вместе с СДК тебе просто надо будет загенерить управляющий интерфейс, я так это представляю, оверлей умирает ( отбрасывается в смысле =) ) сразу.
Ускорить можно с помощью D3D или OGL В общем смотри сам, если это для вебкамеры вообще критично с 1фпс'ом