Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

увеличение размера картинки через TSampleGrabber [D6, WinXP]


diman_1978 ©   (2006-05-23 17:40:00) 

День добрый!
Вот такой вопрос,
граблю изображение с тюнера через dspack
мне в конечном итоге нужно получить набор картинок,
с эти проблем нет,
но картинки получаемые с помощью функции
SampleGrabber.GetBitmap(bmp);
имеет размер 352*288,
а хотелось бы получать больший размер
использовал кусок кода, приведенный в ответах на форуме

hr := (FilterGraph as ICaptureGraphBuilder2).FindInterface(@PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video,
 Filter as IBaseFilter, IID_IAMStreamConfig, pVideoStreamConfig);
 if (hr <> NOERROR) Then raise Exception.Create('Unable create instance of IAMStreamConfig');

 hr := pVideoStreamConfig.GetFormat(pmt);
 if (hr <> NOERROR) Then
 Begin
   pVideoStreamConfig := Nil;
   raise Exception.Create('Unable get stream video format');
 End;
 VIDEOINFOHEADER(pmt.pbFormat^).bmiHeader.biWidth  := 768;
 VIDEOINFOHEADER(pmt.pbFormat^).bmiHeader.biHeight := 576;
 hr := pVideoStreamConfig.SetFormat(pmt^);

вроде бы все проходит, но размер сохраненных картинок с помощью SampleGrabber.GetBitmap(bmp); не изменяется.
Подскажите пожалуйста!
Заранее благодарен.


diman_1978   (2006-06-07 11:40:00) [1]

Авось поможет братьям по несчастью :)
Но DSpack должен стоять на компе, если нет
то его можно скачать из родного сайта разработчиков DSPack
http://progdigy.com/
там же есть и неплохие англоязычные форумы.


diman_1978   (2006-06-07 11:37:00) [2]

Насчет исходников:)
http://slil.ru/22816940
там куча заремированного, но думаю разобраться можно,
код некрасивый, так как эксперементальный:)
будут вопросы, пишите в форум или на мыло.


diman_1978   (2006-06-07 11:24:00) [3]

Насчет переключения входов, расскажу что получилось у меня:
Для переключения входов на любом устройстве видеозахвата можно использовать интерфейс из DirectShow - IAMCrossbar
IAMCrossbar = interface(IUnknown)
   ['{C6E13380-30AC-11d0-A18C-00A0C9118956}']
   (*** IAMCrossbar methods ***)
   function get_PinCounts(out OutputPinCount, InputPinCount: Longint): HResult; stdcall;
   function CanRoute(OutputPinIndex, InputPinIndex: Longint): HResult; stdcall;
   function Route(OutputPinIndex, InputPinIndex: Longint): HResult; stdcall;
   function get_IsRoutedTo(OutputPinIndex: Longint;
     out InputPinIndex: Longint): HResult; stdcall;
   function get_CrossbarPinInfo(IsInputPin: BOOL; PinIndex: Longint;
     out PinIndexRelated : longint; out PhysicalType: TPhysicalConnectorType): HResult; stdcall;
 end;
Как видно он небольшой.

Чтобы его получить вызываем следующий код:

var
 amcbTest: IAMCrossBar;
..........
begin

предположим после кода с изменением размера картинки, вставляем след код:

 hR := (FilterGraph as ICaptureGraphBuilder2).FindInterface(@LOOK_UPSTREAM_ONLY, nil, Filter as IBaseFilter, IID_IAMCrossbar, amcbTest);
можно и без hr :)

....
end;

Получили ссылку на интерфейс.
Далее надо переключиться.
для этого используем метод
function Route(OutputPinIndex, InputPinIndex: Longint): HResult; stdcall;
где указываем номера входного и выходного входов, с которых мы хотим получать изображение, и куда выводить.

но остается вопрос, как узнать эти номера:

я сделал все банально:

var
 CountOutput, countinput: Integer;
 i, j: Integer;
begin
 if Succeeded(Filter.QueryInterface(IAMCrossBar, amcbTest)) then
    amcbTest.get_PinCounts(CountOutput, countinput);
 for i := 0 to CountOutput - 1 do
   for j := 0 to countinput - 1 do
   begin
     amcbTest.Route(i, j);
     Sleep(1000);
  end;
end;
и мило наблюдал, что уменя появиться на панели пердварительно отображения.

оказалось что при значениях
amcbTest.Route(0, 1);
у меня становится активным композитивный вход.

думаю что переключением входов видео должно быть тоже самое, интерфейс IAMCrossbar универсальный и ему по барабану что переключать.


tsa   (2006-06-07 08:46:00) [4]

По логике должно быть расширение 768*288 - по ширине как кадр, по высоте половина кадра - только чётные или только не чётные строки. это "поле", их 50 штук в секунду. почему одно поле идёт как 352*288 не понятно.. если масштабировать по ширине - потеряется чёткость. Не говорят же "половина чётной строки" - строки всегда идут целиком!

Господа, не поделитесь полным кодом обращения к тв тюнеру через Dspack? частями трудно понять, может опубликуете весь код на http://www.slil.ru/


medved_68   (2006-06-07 08:38:00) [5]


> P.S. На форумах видел вопросы по программному переключению
> входов на картах видеозахвата (с TV на Compositive и т.д.
> ), если кому надо, могу выложить код:)

А случаем ни где не натыкался на программное переключение входов видео???
А то есть 4Х входовая плата захвата но работает по умолчанию только один а вот как на остальные переходить???


medved_68   (2006-06-06 12:51:00) [6]


> Еще есть такие фильтры деинтерлейсинга, они вроде сглаживают
> эту расческу. Попробую с ними поработать.

Правильным курсом идете Соратник

> Описания у меня пока тоже нет, только скачал pdf-ку по микрухе
> Philips, если надо то пиши на мыло, скину.

Есть ПДФ по Philips7134 но там такая муть Короче не нашел я максимально выдаваемое разрешение А насчет хороших карт захвата не ищи их просто нет Есть Philips7135 кажется 10 битовые но это все для улучшения цветопередачи а не разрешения Просто буржуи не ставили себе такой задачи по крайней мере для массового использования. Ты идешь тем же курсом что и я 2 года назад. Я просто остановился на Аверах напряг тоже какойто фильтр из DSPack и уменьшил панель воспроизведения. А сейчас вообще думаю переписать прогу И вместо TPanel выводить на Имаже т. е. примерно то что  ты  сейчас делаешь. Просто возникла необходимость качать картинки по сетке.


diman_1978   (2006-06-06 11:54:00) [7]

Описания у меня пока тоже нет, только скачал pdf-ку по микрухе Philips, если надо то пиши на мыло, скину.
У меня тоже возникает мысль, что может сам тюнер аппаратно больше не тянет. Надо найти толковую карту видеозахвата и на ней поэксперементировать.
Еще есть такие фильтры деинтерлейсинга, они вроде сглаживают эту расческу. Попробую с ними поработать.
Пробовал уменьшать и увеличивать частоту кадров, не помогло.

P.S. На форумах видел вопросы по программному переключению входов на картах видеозахвата (с TV на Compositive и т.д.), если кому надо, могу выложить код:)


medved_68   (2006-06-02 08:45:00) [8]

Представляешь запихал я твой код и получил то о чем ты пишешь( в смысле разрешения) все бы ничего но только одно маленькое но, у меня под рукой был AverMedia EZCapture короче такая маленькая и слабенкая плата видеозахвата."Расческа" тоже появилась при выдирании.Обратился к стандартному софту AverMedia так там есть даже 720х480 но при изменении разрешения автоматически уменьшаются размеры панели видеовывода. Попробовал уменьшить панель у себя "расческа" несколько сгладилась.Это наводит на определенные мысли(может они в корне неверны) А действительно ли карта выдает 640х480 или может быть драйвер корректирует захваченный кадр.В принципе проблема снимается просмотром даташита на Philips и Fusion, но к сожалению ни того ни другого бесплатно я не нашел. Может у тебя что то под рукой валяется????


diman_1978   (2006-06-01 10:55:00) [9]

Этот пример я видел, да там для тюнера Beholder 409 есть только разрешение 352*288.
Нашел я способ увеличить размер изображения,вот код:

hr := (FilterGraph as ICaptureGraphBuilder2).FindInterface (@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video,
 Filter as IBaseFilter, IID_IAMStreamConfig, pVideoStreamConfig);
надо было указать @PIN_CATEGORY_PREVIEW вместо @PIN_CATEGORY_CAPTURE,
так как PIN_CATEGORY_PREVIEW используется для предпосмотра, с которого я и граблю,
а PIN_CATEGORY_CAPTURE, когда реально пишешь avi файл

 if (hr <> NOERROR) Then raise Exception.Create('Unable create instance of IAMStreamConfig');

 hr := pVideoStreamConfig.GetFormat(pmt);
 if (hr <> NOERROR) Then
 Begin
   pVideoStreamConfig := Nil;
   raise Exception.Create('Unable get stream video format');
 End;
  VIDEOINFOHEADER(pmt.pbFormat^).bmiHeader.biWidth  := 640;
//иногда в примерах предлагают использовать VIDEOINFOHEADER2, у меня получилось через VIDEOINFOHEADER

 VIDEOINFOHEADER(pmt.pbFormat^).bmiHeader.biHeight := 480;
вместо
 hr := pVideoStreamConfig.SetFormat(pmt^);

 pVideoStreamConfig:= nil;
 if Assigned(pmt) then
 DeleteMediaType(pmt);
// коненчо разрешение абы какое тоже не задашь, желательно стандартное.
Но возникла новая проблема при предпросмотре и выдирании картинок с разрешением большим чем 352*288 получаются размытые полукадры, если двигать камерой слежения. То есть я получаю так называемую расческу, нечетные строки имеют одни координаты, а четные уже другие.
Может кто знает как победить эту беду.


medved_68   (2006-05-26 18:35:00) [10]


> Вопрос как программно задать его????

В DSPack есть пример кажется Filter Enumerator или рядом
Там перечисляются все возможности установленного драйвера тюнера типа в TMemo. Короче просто выбираешь нужный индекс и привет семье. Но когда я эксперементировал с разными тюнерами получилось следующее:
некоторые из Averov плевать хотели на эти настройки а вот Philips кое что получалось, но все равно обещанные 768 х на черт знает что я не получил.
Насчет кода я посмотрю гдето валяется


diman_1978   (2006-05-26 16:04:00) [11]

Тюнер у меня на Philips 7135,
значит как-бы аппаратно может выдавать большее разрешение
Вопрос как программно задать его???? :)
хотелось бы посмотреть получить кусок рабочего кода, если есть такая возможность.


medved_68   (2006-05-26 14:29:00) [12]


> Тюнер у меня Beholder 409,

Ты меня не понял у тебя тюнер может быть хоть какой нибудь навороченный Aver все зависит от чипа отвечающего за оцифровку Это или bt848, Conexant Fusion 787 что впрочем одно и тоже или более навороченный Philips 7XXX какой не помню Насчет Philips не уверен но по моему что-то в районе 640Х480 а если это bt848 то здесь ты прав


> то есть с него я большее разрешение не получю, так что-ли?


diman_1978   (2006-05-26 11:19:00) [13]

Тюнер у меня Beholder 409,
то есть с него я большее разрешение не получю, так что-ли?


medved_68   (2006-05-26 09:43:00) [14]


> но картинки получаемые с помощью функции
> SampleGrabber.GetBitmap(bmp);
> имеет размер 352*288,

Если у тебя тюнер на Conexant Fusion 878 (аналог ВТ848) то это норма а все прочие разрешения в сопроводиловках к нему реализованы програмно. По крайней мере AverMedia неохотно но прошептало об этом Гдето на сайтах это было ну не помню я.


Наверх

Титульная страница Поиск, карта сайта Написать письмо