我正在写一个简单的可视电话(用于学习),我想知道我必须使用什么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网络协议的安全(我怀疑你需要这样的东西)