我正在写一个简单的可视电话(用于研究),我想知道我必须使用哪些API来从网络中的网络摄像头捕获和发送图像。
P.S。我不会像OpenCV那样使用复杂的库。
答案 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网络协议来保证安全(我怀疑你需要这样的东西)