Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: CL | DM;

Вниз

увеличение размера картинки через TSampleGrabber   Найти похожие ветки 

 
diman_1978 ©   (2006-05-23 17:40) [0]

День добрый!
Вот такой вопрос,
граблю изображение с тюнера через 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); не изменяется.
Подскажите пожалуйста!
Заранее благодарен.


 
medved_68 ©   (2006-05-26 09:43) [1]


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

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


 
diman_1978 ©   (2006-05-26 11:19) [2]

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


 
medved_68 ©   (2006-05-26 14:29) [3]


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

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


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


 
diman_1978 ©   (2006-05-26 16:04) [4]

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


 
medved_68 ©   (2006-05-26 18:35) [5]


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

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


 
diman_1978 ©   (2006-06-01 10:55) [6]

Этот пример я видел, да там для тюнера 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-06-02 08:45) [7]

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


 
diman_1978 ©   (2006-06-06 11:54) [8]

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

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


 
medved_68 ©   (2006-06-06 12:51) [9]


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

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

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

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


 
medved_68 ©   (2006-06-07 08:38) [10]


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

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


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

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

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


 
diman_1978 ©   (2006-06-07 11:24) [12]

Насчет переключения входов, расскажу что получилось у меня:
Для переключения входов на любом устройстве видеозахвата можно использовать интерфейс из 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 универсальный и ему по барабану что переключать.


 
diman_1978 ©   (2006-06-07 11:37) [13]

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


 
diman_1978 ©   (2006-06-07 11:40) [14]

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



Страницы: 1 вся ветка

Текущий архив: 2007.02.04;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.046 c
2-1169037970
Pasha L
2007-01-17 15:46
2007.02.04
png в bmp


15-1168625855
1-st...
2007-01-12 21:17
2007.02.04
SSL +delphi


11-1143445780
nester
2006-03-27 11:49
2007.02.04
[Error] Need imported data reference ($G) to access GUID_NULL


1-1165740150
Makhanev Alexander
2006-12-10 11:42
2007.02.04
Таскать форму правой кнопкой мыши....


6-1157298968
Frimen
2006-09-03 19:56
2007.02.04
Файл IWInitStandAlone.pas для IntraWeb