从networking摄像头捕捉和发送图像的最有效方式

我正在写一个简单的可视电话(用于学习),我想知道我必须使用什么API来捕获和发送来自networking摄像头的图像。

Ps我不会像OpenCV那样使用复杂的库。

您可以使用Windows图像采集(WIA)或/和DirectShow 。 另一个不错的选择是微软媒体基金会 (关于捕捉视频的章节)。

请注意,这是繁琐的apis,这使得这不是一件容易的事情,你最终可能会更好地使用OpenCV。

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

我只是完成了一个类似的任务,我花了好几天的时间去查看各种工具/库。

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文档以获取更多高级功能。 在上面的例子中,你会想要采取“形象”,并以某种方式通过网络管道。 这是你的通信协议。

Windows的典型方法:使用DirectShow从cam捕获视频,使用RTP协议 (通过UDP)进行实时流式传输,也许在live555库的帮助下。

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

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

Skype使用DirectShow捕获和DirectX绘图。 他们使用proprietery网络协议的安全(我怀疑你需要这样的东西)