【发布时间】:2011-02-04 20:18:48
【问题描述】:
我正在编写一个简单的可视电话(用于学习),我想知道我必须使用哪些 API 来从网络中的网络摄像头捕获和发送图像。
附:我不会使用像 OpenCV 这样复杂的库。
【问题讨论】:
我正在编写一个简单的可视电话(用于学习),我想知道我必须使用哪些 API 来从网络中的网络摄像头捕获和发送图像。
附:我不会使用像 OpenCV 这样复杂的库。
【问题讨论】:
您可以使用Windows Image Acquisition (WIA) 或/和DirectShow。另一个不错的选择是Microsoft Media Foundation(capturing video 章节)。
请注意,这是繁琐的 api,这不是一件容易的事,使用 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 从摄像头捕获视频,使用 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 进行绘图。他们使用专有的网络协议来保证安全(我怀疑你需要这样的东西)
【讨论】: