【问题标题】:Most efficient way to capture and send images from a webcam in a network从网络中的网络摄像头捕获和发送图像的最有效方式
【发布时间】:2011-02-04 20:18:48
【问题描述】:

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

附:我不会使用像 OpenCV 这样复杂的库。

【问题讨论】:

    标签: c++ c windows


    【解决方案1】:

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

    请注意,这是繁琐的 api,这不是一件容易的事,使用 OpenCV 可能会更好。

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

    【讨论】:

    • 那么你推荐我使用 OpenCV 吗?在您看来,哪些方法使用 MSN 和 skype 等程序?谢谢:)
    • 他们很可能不直接使用它们,而是通过内部开发或第三方许可的专有解决方案以包装库的形式隐藏此类 API 的丑陋方面,例如 GIPS,目前已被谷歌收购。雅虎通,例如。使用 GIPS。 GIPS 也能够处理网络部分。 :-)
    【解决方案2】:

    我刚刚完成了一项类似的任务,我花了几天时间研究各种工具/库。

    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 文档以了解更高级的功能。在上面的示例中,您需要获取“图像”并以某种方式通过网络将其传输。这取决于您的通信协议。

    【讨论】:

      【解决方案3】:

      Windows 的典型方法:使用 DirectShow 从摄像头捕获视频,使用 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 进行绘图。他们使用专有的网络协议来保证安全(我怀疑你需要这样的东西)

      【讨论】:

        猜你喜欢
        • 2013-02-09
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多