singlepost

[С++ / WinAPI / DirectShow] Чтение, вывод и статистика видео-потока. << На главную или назад  

Доброго всем времени суток!

Собственно, нужно сделать следующее:

Есть видеопоток с веб-камеры. 640х480 пикселей. Нужно сделать простую вещь – пользователь задает номер (адрес) пикселя (например, 10х15 или 640х479) и выводит цвет этого пикселя (RGB).

И все бы хорошо, но… Я вообще ничего не знаю по этой теме ) Гугл помог найти сайт: //directshow.wonderu.com/

Но там есть далеко не все, что мне нужно.

В принципе, у меня есть шаблон, который выводит видео на экран, но как вытаскивать номер цвета, я не знаю.

У кого-нибудь есть идеи?)

48 ответов в теме “[С++ / WinAPI / DirectShow] Чтение, вывод и статистика видео-потока.”

  1. 11
    Роман Гулько ответил:

    Да, в эту строну…

  2. 10
    Денис Доманский ответил:

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

    //msdn.microsoft.com/en-us/library/dd407288%28v...

    ?

  3. 9
    Денис Доманский ответил:

    Благодарю. Значит ближайшие часы своей жизни я потрачу на прикручивание и использование этого самого графа )

  4. 8
    Роман Гулько ответил:

    Посмотрел пример, помойму не кривой, сделано с помощью DS, впринципе тоже что писал в #5 ответе, за исключением того что в граф не включён ISampleGrabber для грабинга кадров.

  5. 7
    Денис Доманский ответил:

    Я пока что ничего не получаю, потому что вообще не в курсе, с какой стороны трогать этот самый ДиректШоу =)

    В любом случае, спасибо большое всем, кто отписался.

    Как я уже говорил, у меня есть шаблон. Просто пример. Мне он кажется весьма кривоватым, но выбирать не приходится. Сейчас вот читаю сайт и курю исходники примера.

    Вот он:

    //snipt.org/Ioll

  6. 6
    Роман Гулько ответил:

    Думаю что видео с камеры автор получает именно с помощью DirectShow, и вставить в граф фильтров СемплГраббер не составит труда, а раскадровку выполнять не обязательно, можно и напрямую в семплах ковыряться, но это первое, а второе и самое интересное заключается в следующем:

    ТВ-тюнеры, камеры и ПРОИГРЫВАТЕЛИ обычно используют ОВЕРЛЕИ.
    Оверлей – видеопоток,воспроизводится через специальный режим DirectDraw, называемый Overlay (оверлей). При этом видеоинформация выводится НЕ В ВИДЕОБУФЕР, а в отдельную область локальной памяти видеоплаты, где она дополнительно обрабатывается аппаратными средствами самой видеоплаты .
    На экран оверлей выводится по технологии "ключей". ОС рисует окно, где должен отображаться оверлей и заполняет его "ключевым цветом"; видеоконтроллер, встречая этот цвет, при выводе замещает его данными из буфера оверлея.
    Ради эксперимента попробуйте сделать принтскрин проигывающегося видео, и не останавливая видео, вставьте полученную копию экрана например в paint, в итоге получишь ЧЁРНЫЙ ЭКРАН вместо кадра.

    Так что всёже сомневаюсь в использовании простого GetPixel()…

  7. 5
    Алексей Перепечко ответил:

    хм… не согласен я с вами. Если он выводит картинку на экран и с нее ему надо получить пиксель, мой вариант проще. достаточнополучить заголовок компоненты, на котором отрисовывается видео и циклически опрашивать данную функцию. возвращает она как раз таки цвет. HDC получить очень просто. и работать будет всяко быстрее, чем раскадровка видео в битмапы. но работать будет только в том случае, если окно выводящее изображение имеет фокус, а это да, это минус.

  8. 4
    Роман Гулько ответил:

    HDC точно не подойдёт. Это решается действительно с помощью DirectShow (используй компонеты DSpack+DSutil для Дельфи, Билдера или DirectShowNet Library для .NET).
    Например для дельфи:
    Находишь все видеоустройства в системе
    VideoDevice:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);

    Задаёшь видеоустройство с которым будешь работать с помощью Моникёра
    Filter1.BaseFilter.Moniker := VideoDevice.GetMoniker(VideoDevice.Filters[i].FriendlyName)

    Создаёшь граф вида:
    Фильтр камеры ->SampleGrabber->Фильтр вывода на экран

    RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter1 as IBaseFilter, SampleGrabber1 as IBaseFilter, VideoWindow1 as IbaseFilter);

    Граббером получаешь кадры
    SampleGrabber1.GetBitmap(Image1.Picture.Bitmap);

    И определяешь цвет нужного пикселя
    Color:TColor;
    Color:=Image1.Picture.Bitmap.Canvas.Pixels[i,j];
    и составляющие RGB
    r:=GetRValue(Color);
    g:=GetGValue(Color);
    b:=GetBValue(tColor);

    И выводишь

    directshow.wonderu.com тебе в помощь

  9. 3
    Алексей Перепечко ответил:

    может GetPixel(DC: HDC; X, Y: Integer): Longint; из WinAPI вам подойдет? HDC – это хэндл окна.

  10. 2
    Александр Кручинин ответил:

    Вроде бы есть компонент для Builder – надо посмотреть его исходники

  11. 1
    александр Г... ответил:

    .

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.