Обработка видеосигнала

Тема в разделе "WASM.WIN32", создана пользователем BREND, 6 окт 2008.

  1. BREND

    BREND New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2008
    Сообщения:
    7
    Помогите решить проблему:
    Есть видео файл. Нужно написать программу для обработки шумов в видео.
    Вот например - через такую функцию:
    -----------------
    Код (Text):
    1. type
    2.   TVector = array of Double;   // Представление данных для процедур модуля
    3.  
    4. // Удаление шума из сигнала с использованием вейвлет-преобразования.
    5. // Функция выполняет разложение исходного сигнала Signal с использованием
    6. // вейвлета Mode порядка Order. Возвращаемое значение - сигнал,
    7. // восстановленный по коэффициентам аппроксимации на уровне Level.
    8. function Denoise(
    9.   const Signal: TVector; // Исходный сигнал
    10.   const Mode: Integer;   // Тип вейвлета
    11.   const Order: Integer;  // Порядок вейвлета
    12.   const Level: Integer   // Глубина разложения
    13.   ): TVector;            // Обработанный сигнал
    14.   overload;
    Проблема в том, что я не знаю как мне представить видеосигнал через array of double?
    А затем еще и наоборот???
    Все что я нашел - это вывод видео через Directshow, и то в несколько строк ((
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    BREND
    Что касается Directshow то обработку нужно делать через написание фильтера. Я пока не разбирался да и желания нет.
    А вот в VFW попроще. Открываешь файл пример есть в MSDN на выходе у тебя будет картинка.
    У кортинок есть два основных формата RGB и YUV. Остальные являются производными или невтричаются, встречаются редко. Можно сделать реализацию для обработки этих двух форматов или попросить систему чтобы он преобреобразовала в нуный или самому преобразовать.

    Что касается получения массива вещественных чисел то это делается при помощи цикла.
     
  3. BREND

    BREND New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2008
    Сообщения:
    7
    Скачал я VFW.PAS, дома посмотрю.

    Хотя с примером было бы намного легче.
     
  4. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    в сэмплах directshow есть фильтр, непомню как называется.., как то rgb... вобщем найдешь (ненайдешь завтра скажу).
    Это трасформ фильтр, на пять секунд меняет цвет видео. Начни с него
     
  5. BREND

    BREND New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2008
    Сообщения:
    7
    Мне подсказали хороший пример по VFW - avi2bmp.
    Там такой порядок:
    AVIFileInit;
    // Открываем AVI - файл
    AVIFileOpen(tekFile, PChar(FileName), 0, nil);
    // Открывыем видеопоток
    AVIFileGetStream(tekFile, tekAVIStream, streamtypeVIDEO, 0);
    А дальше идет чтение по кадрам:
    // Подготовка к декомпрессии видео кадра
    gapgf := AVIStreamGetFrameOpen(AVIStream, nil);
    lpbi := AVIStreamGetFrame(gapgf, iFrameNumber);

    В результате получается картинка.
     
  6. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    ну и вот... Фильтр в сэмплах directshow называется EZRGB24,
    вот кусок кода

    Код (Text):
    1. //
    2. // Transform (in place)
    3. //
    4. // 'In place' apply the image effect to this sample
    5. //
    6. HRESULT CEZrgb24::Transform(IMediaSample *pMediaSample)
    7. {
    8.     BYTE *pData;                // Pointer to the actual image buffer
    9.     long lDataLen;              // Holds length of any given sample
    10.     unsigned int grey,grey2;    // Used when applying greying effects
    11.     int iPixel;                 // Used to loop through the image pixels
    12.     int temp,x,y;               // General loop counters for transforms
    13.     RGBTRIPLE *prgb;            // Holds a pointer to the current pixel
    14.  
    15.     AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType();
    16.     VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pType->pbFormat;
    17.     ASSERT(pvi);
    18.  
    19.     CheckPointer(pMediaSample,E_POINTER);
    20.     pMediaSample->GetPointer(&pData);
    21.     lDataLen = pMediaSample->GetSize();
    22.  
    23.     // Get the image properties from the BITMAPINFOHEADER
    24.  
    25.     int cxImage    = pvi->bmiHeader.biWidth;
    26.     int cyImage    = pvi->bmiHeader.biHeight;
    27.     int numPixels  = cxImage * cyImage;
    28.  
    29.     // int iPixelSize = pvi->bmiHeader.biBitCount / 8;
    30.     // int cbImage    = cyImage * cxImage * iPixelSize;
    31.  
    32.     switch (m_effect)
    33.     {
    34.         case IDC_NONE: break;
    35.  
    36.         // Zero out the green and blue components to leave only the red
    37.         // so acting as a filter - for better visual results, compute a
    38.         // greyscale value for the pixel and make that the red component
    39.  
    40.         case IDC_RED:
    41.                        
    42.             prgb = (RGBTRIPLE*) pData;
    43.             for (iPixel=0; iPixel < numPixels; iPixel++, prgb++) {
    44.                 prgb->rgbtGreen = 0;
    45.                 prgb->rgbtBlue = 0;
    46.             }
    47.             break;
    IDC_RED - это идентификатор эффекта, показывать только красную составляющую. А тебе нужно только собрать этот фильтр и применить свой эффект.
     
  7. BREND

    BREND New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2008
    Сообщения:
    7
    Я понял, что есть 2 варианта: или через Directshow или через VFW.
    Сейчас разбираюсь с этим:
    http://www.libray.narod.ru/Program/DirectX/Chapter6.html

    letopisec
    В таком случае, нужно будет писать DS-фильтр, регистрировать его в системе, а затем подключать через DSPACK.
     
  8. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    фильтр писать не надо, он уже написан). Запихни внутрь CEZrgb24::Transform(IMediaSample *pMediaSample) свой алгоритм и тесть при помощи grapheditor. Это саоме простое что можно придумать. При этом получишь все преимущества дирекшоу Тоесть независимость от форматов входных файлов, независимость выходных - хочешь пиши в файл, а хочешь рендерь.
     
  9. BREND

    BREND New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2008
    Сообщения:
    7
    Все бы было хорошо, но Ezrgb24 не компилиццо!
    Просто линкер выдает ошибки, что не может связать имена.
    Такая же судьба и для http://vlafy.iulabs.com/rus/progds.htm (ошибка линкера)

    Зато в делвях все хорошо ).
    Открыл DSPACK234\Demos\D6-D7\Filters\Alpha Renderer\.
    Зменил несколько строк на
    Код (Text):
    1. for x := 0 to FWidth * FHeight - 1 do
    2.   begin
    3.     d.rgbRed := Byte((Source.rgbRed * Source.rgbReserved div 256 +
    4.       Checkers.rgbRed * (256 - Source.rgbReserved) div 256));
    5.     d.rgbGreen := 0;
    6.     d.rgbBlue := 0;
    7.  
    8.     CopyMemory(Source, @d, SizeOf(RGBQUAD));
    9.     Inc(Source);
    10.     Inc(Checkers);
    11.   end;
    И фльтр уже выводил в красных тонах.

    Все компилиться, регистрируется и пашет в Graphedit.

    Теперь вопрос: я открываю файл через DSPACK, автоматически строится цепочка фльтров (FilterGraph.RenderFile) и выводится (FilterGraph.Play). Как мне вставить свой фильтр (или трансформ, или рендер) в цепочку?
     
  10. BREND

    BREND New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2008
    Сообщения:
    7
    Написал два варианта: один по avi2bmp, второй - по DSPACK\Demos\D6-D7\SampleGrabber.
    Вывожу картинки через таймер.
    В avi2bmp - через AVIStreamGetFrame получаю Tbitmap. Но я не могу его изменить! Меняю Bitmap, на выходе - нифига.
    2-й варинат лучше - поддерживает все форматы.
    В SampleGrabber - через SampleGrabber.GetBitmap(Image.Picture.Bitmap). Для примера - поменял местами два цвета.
    В Samplegrabber когда бросаю массив из картинки на фильтр Denoise, то все начинает очень глючить!
    Как GetBitmap получить определенный кадр (по номеру)?.
     
  11. BREND

    BREND New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2008
    Сообщения:
    7
    Кто небудь имеет нормальный модуль для записи видео с TBitmap, так, чтоб в 3 ф-ии: 'создать' - 'записать кадр' - 'закрыть' ?
    Все примеры, какие я нашел - это запись из bmp файлов.

    Или хотя бы скажите как получить PBitmapInfoHeader из TBitmap?