Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Вниз

увеличение размера картинки через 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 вся ветка

Форум: "Media";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.044 c
2-1168939463
nick_van_rijn
2007-01-16 12:24
2007.02.04
изменение переменных процесса снаружи


3-1163160336
Kolan
2006-11-10 15:05
2007.02.04
Как колонки сделать строками(SQL)


1-1165586648
.ruslan
2006-12-08 17:04
2007.02.04
Информация о создании компонента


2-1168947031
Barma
2007-01-16 14:30
2007.02.04
StringGrid


2-1169104807
Glivera
2007-01-18 10:20
2007.02.04
Вопрос по SynEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский