从网络中的网络摄像头捕获和发送图像的最有效方法

时间:2011-02-04 10:28:37

标签: c++ c windows

我正在写一个简单的可视电话(用于研究),我想知道我必须使用哪些API来从网络中的网络摄像头捕获和发送图像。

P.S。我不会像OpenCV那样使用复杂的库。

3 个答案:

答案 0 :(得分:3)

您可以使用Windows Image Acquisition (WIA)或/和DirectShow。另一个不错的选择是Microsoft Media Foundation(关于capturing video的章节)。

请注意,这是一个繁琐的api,这使得这不容易,而且使用OpenCV可能会更好。

对于网络部分,这取决于您的设计和偏好。

答案 1 :(得分:3)

我刚刚完成了类似的任务,我花了几天时间查看各种工具/库。

DirectShow是Windows的默认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文档以获得更多高级功能。在上面的例子中,你想要以某种方式通过网络获取“图像”和管道。这取决于您的通信协议。

答案 2 :(得分:1)

适用于Windows的典型方法:使用DirectShow从cam捕获视频,使用RTP protocol(通过UDP)进行实时流式传输,可能需要live555 library的帮助。

DirectShow方式: 实现将音频/视频流式传输到网络的渲染器过滤器和从网络接收音频/视频的源过滤器。数据流:

web-cam source filter -> your renderer filter -> [network] -> your source filter -> video renderer filter
                                                                                 -> audio renderer filter

Skype使用DirectShow进行捕获,使用DirectX进行绘制。他们使用proprietery网络协议来保证安全(我怀疑你需要这样的东西)