2011-02-04 101 views

回答

3

您可以使用Windows Image Acquisition (WIA)或/和DirectShow。另一個不錯的選擇是Microsoft Media Foundation(關於capturing video的章節)。

請注意,這是繁瑣的apis,這使得這不是一件容易的事,你可能會更好地使用OpenCV。

至於網絡部分,這取決於您的設計和偏好。

+0

那麼你推薦我使用OpenCV?在你看來,methos確實使用了像MSN和Skype這樣的程序?感謝:) – xRobot 2011-02-04 11:05:53

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文檔以獲取更多高級功能。在上面的例子中,你會想要拍攝「圖像」,並以某種方式通過網絡傳播。這取決於您的通信協議。

1

的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進行繪製。他們使用proprietery網絡協議的安全(我懷疑你需要這樣的東西)