Доброго всем времени суток!
Собственно, нужно сделать следующее:
Есть видеопоток с веб-камеры. 640х480 пикселей. Нужно сделать простую вещь – пользователь задает номер (адрес) пикселя (например, 10х15 или 640х479) и выводит цвет этого пикселя (RGB).
И все бы хорошо, но… Я вообще ничего не знаю по этой теме ) Гугл помог найти сайт: //directshow.wonderu.com/
Но там есть далеко не все, что мне нужно.
В принципе, у меня есть шаблон, который выводит видео на экран, но как вытаскивать номер цвета, я не знаю.
У кого-нибудь есть идеи?)
4 апреля 2010 в 22:01
Да, в эту строну…
4 апреля 2010 в 19:00
Насколько я понимаю, смотреть стоит в эту сторону:
//msdn.microsoft.com/en-us/library/dd407288%28v...
?
4 апреля 2010 в 18:05
Благодарю. Значит ближайшие часы своей жизни я потрачу на прикручивание и использование этого самого графа )
4 апреля 2010 в 18:04
Посмотрел пример, помойму не кривой, сделано с помощью DS, впринципе тоже что писал в #5 ответе, за исключением того что в граф не включён ISampleGrabber для грабинга кадров.
4 апреля 2010 в 15:02
Я пока что ничего не получаю, потому что вообще не в курсе, с какой стороны трогать этот самый ДиректШоу =)
В любом случае, спасибо большое всем, кто отписался.
Как я уже говорил, у меня есть шаблон. Просто пример. Мне он кажется весьма кривоватым, но выбирать не приходится. Сейчас вот читаю сайт и курю исходники примера.
Вот он:
//snipt.org/Ioll
4 апреля 2010 в 15:01
Думаю что видео с камеры автор получает именно с помощью DirectShow, и вставить в граф фильтров СемплГраббер не составит труда, а раскадровку выполнять не обязательно, можно и напрямую в семплах ковыряться, но это первое, а второе и самое интересное заключается в следующем:
ТВ-тюнеры, камеры и ПРОИГРЫВАТЕЛИ обычно используют ОВЕРЛЕИ.
Оверлей – видеопоток,воспроизводится через специальный режим DirectDraw, называемый Overlay (оверлей). При этом видеоинформация выводится НЕ В ВИДЕОБУФЕР, а в отдельную область локальной памяти видеоплаты, где она дополнительно обрабатывается аппаратными средствами самой видеоплаты .
На экран оверлей выводится по технологии "ключей". ОС рисует окно, где должен отображаться оверлей и заполняет его "ключевым цветом"; видеоконтроллер, встречая этот цвет, при выводе замещает его данными из буфера оверлея.
Ради эксперимента попробуйте сделать принтскрин проигывающегося видео, и не останавливая видео, вставьте полученную копию экрана например в paint, в итоге получишь ЧЁРНЫЙ ЭКРАН вместо кадра.
Так что всёже сомневаюсь в использовании простого GetPixel()…
4 апреля 2010 в 10:04
хм… не согласен я с вами. Если он выводит картинку на экран и с нее ему надо получить пиксель, мой вариант проще. достаточнополучить заголовок компоненты, на котором отрисовывается видео и циклически опрашивать данную функцию. возвращает она как раз таки цвет. HDC получить очень просто. и работать будет всяко быстрее, чем раскадровка видео в битмапы. но работать будет только в том случае, если окно выводящее изображение имеет фокус, а это да, это минус.
3 апреля 2010 в 22:01
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 тебе в помощь
3 апреля 2010 в 20:04
может GetPixel(DC: HDC; X, Y: Integer): Longint; из WinAPI вам подойдет? HDC – это хэндл окна.
3 апреля 2010 в 10:04
Вроде бы есть компонент для Builder – надо посмотреть его исходники
3 апреля 2010 в 10:01
.