Самый эффективный способ захвата и отправки изображений с веб-камеры в сети - PullRequest
2 голосов
/ 04 февраля 2011

Я пишу простой видеофон (для учебы) и хотел бы знать, какие API-интерфейсы я должен использовать для захвата и отправки изображений с веб-камеры в сети.

Ps Я бы не использовал сложную библиотекукак OpenCV.

Ответы [ 3 ]

3 голосов
/ 04 февраля 2011

Я просто выполняю аналогичную задачу, я потратил несколько дней на просмотр различных инструментов / библиотек.

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 для более сложных функций. В приведенном выше примере вы захотите взять «изображение» и передать его по сети. Который до вашего протокола связи.

3 голосов
/ 04 февраля 2011

Вы можете использовать Windows Image Acquisition (WIA) или / и DirectShow . Другая хорошая альтернатива - Microsoft Media Foundation (глава о захвате видео ).

Имейте в виду, что это громоздкие API-интерфейсы, которые делают эту задачу непростой, и вы можете в конечном итоге лучше использовать OpenCV.

Что касается сетевой части, это зависит от вашего дизайна и предпочтений.

1 голос
/ 04 февраля 2011

типичный подход для 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 для рисования. они используют сетевой протокол для безопасности (я сомневаюсь, что вам нужно что-то подобное)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...