Самый эффективный способ захвата и отправки изображений с веб-камеры в сети
Я пишу простой видеофон (для учебы) и хотел бы узнать, какие API-интерфейсы я должен использовать для захвата и отправки изображений с веб-камеры в сети.
PS Я бы не стал использовать сложные библиотеки, такие как OpenCV.
3 ответа
Вы можете использовать Windows Image Acquisition (WIA) или / и DirectShow. Еще одна хорошая альтернатива - Microsoft Media Foundation(глава о захвате видео).
Имейте в виду, что это громоздкие API-интерфейсы, которые делают это нелегкой задачей, и вы могли бы в конечном итоге лучше использовать OpenCV.
Что касается сетевой части, это зависит от вашего дизайна и предпочтений.
Я просто выполняю аналогичную задачу, я провел дни, просматривая различные инструменты / библиотеки.
DirectShow - это API по умолчанию для окон, однако он сложен для простых задач. OpenCV отстает в поддержке своих устройств, а videoInput (плагин / надстройка) улучшает OpenCV.
Я смог получить простой дисплей и запустить:
http://www.aishack.in/2010/03/capturing-images-with-directx/
Использование библиотеки videoInput и OpenCV:
http://muonics.net/school/spring05/videoInput/
OpenCV может выглядеть сложным, однако, поскольку первая ссылка демонстрирует только страницу кода:
#include "stdafx.h"
#include "videoInput.h"
#include "cv.h"
#include "highgui.h"
int main()
{
videoInput VI;
int numDevices = VI.listDevices();
int device1= 0;
VI.setupDevice(device1);
int width = VI.getWidth(device1);
int height = VI.getHeight(device1);
IplImage* image= cvCreateImage(cvSize(width, height), 8, 3);
unsigned char* yourBuffer = new unsigned char[VI.getSize(device1)];
cvNamedWindow("test");
while(1)
{
VI.getPixels(device1, yourBuffer, false, false);
image->imageData = (char*)yourBuffer;
cvConvertImage(image, image, CV_CVTIMG_FLIP);
cvShowImage("test", image);
if(cvWaitKey(15)==27) break;
}
VI.stopDevice(device1);
cvDestroyWindow("test");
cvReleaseImage(&image);
return 0;
}
VideoInput.h - это документация, которая вам понадобится для того, чтобы приступить к работе, оттуда вы можете прочитать документацию OpenCV для более сложных функций. В приведенном выше примере вы захотите взять изображение и передать его по сети. Что зависит от вашего протокола связи.
Типичный подход для Windows: используйте DirectShow для захвата видео с камеры, используйте протокол RTP (через UDP) для потоковой передачи в реальном времени, возможно, с помощью библиотеки live555.
Способ DirectShow: внедрить фильтр рендерера, который передает аудио / видео в сеть, и фильтр источника, который получает аудио / видео из сети. Поток данных:
web-cam source filter -> your renderer filter -> [network] -> your source filter -> video renderer filter
-> audio renderer filter
Skype использует DirectShow для захвата и DirectX для рисования. они используют сетевой протокол для безопасности (я сомневаюсь, что вам нужно что-то подобное)