全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4588
推到 Plurk!
推到 Facebook!

使用DirectShow 驅動 攝影機

 
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-31 10:48:49 IP:61.218.xxx.xxx 未訂閱
使用DirectShow 驅動 攝影機 對於小攝像頭的驅動有幾種方法,通過使用DirectShow來驅動攝像頭靈活性比較好,有簡單的方法也有比較複雜但更有效的方法,本文只介紹簡單方法,希望與大家交流! 用DirectShow來使用攝像頭,一般要求攝像頭的驅動是WDM格式的,當然,一些比較老的驅動格式DirectShow也可支持。DirectShow通過圖形過濾管理器(Filter Graph Manager)來與上層應用程式和下層的驅動進行聯繫。DirectShow通過一種叫作捕獲篩檢程式(Capture Filter)的東東來支持對攝像頭的捕獲,一個捕獲篩檢程式有多個插口(pin),其中的預覽(preview)插口可用來進行顯示禎圖像。 DirectShow通過幾個COM介面來對視頻捕獲的全過程進行控制,其中IGraphBuilder 用於建立篩檢程式,ICaptureGraphBuilder2用於與下層的驅動程式建立聯繫,IVideoWindow,IMediaControl,IMediaEventEx分別對整個過程的視頻視窗,播放過程和事件回應進行控制, 下面是程式: CComQIPtr m_pVW; CComQIPtr m_pMC; CComQIPtr m_pME; CComPtr m_pGraph; CComPtr m_pCapture; DWORD m_dwGraphRegister; bool bInit(HWND hWnd) { HRESULT hr; //獲得介面 hr=CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,IID_IGraphBuilder, (void **) &m_pGraph); if (FAILED(hr)) return false; hr=CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **) &m_pCapture); if (FAILED(hr)) return false; m_pMC=m_pGraph; m_pVW=m_pGraph; m_pME=m_pGraph; //取得消息 m_pME->SetNotifyWindow((OAHWND)(m_hWnd=hWnd), WM_GRAPHNOTIFY, 0); //將過濾和捕獲進行連接 m_pCapture->SetFiltergraph(m_pGraph); //設備聯接 //枚舉設備 CComPtr pCde=NULL; CComPtr pEm=NULL; hr=CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &pCde); if (FAILED(hr)) return false; pCde->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0); if(pEm==NULL) return false; CComPtr pM=NULL; ULONG cFetched; CComPtr pBf=NULL; if(pEm->Next(1,&pM,&cFetched)==S_OK) { pM->BindToObject(0,0,IID_IBaseFilter, (void**)&pBf); pM.Release(); } else { return false; } //將設備添加到graph hr = m_pGraph->AddFilter(pBf, L"Video Capture"); if (FAILED(hr)) return false; //連接一個源插口 hr=m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pBf,NULL,NULL); if (FAILED(hr)) return false; pBf.Release(); //設定視頻視窗 //設定視頻視窗為主視窗的一個子視窗 hr=m_pVW->put_Owner((OAHWND)hWnd); if (FAILED(hr)) return false; //設定視窗樣式 m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN); if (FAILED(hr)) return false; //設定窗口大小 CRect rectClient; GetClientRect(hWnd,rectClient); m_pVW->SetWindowPosition(0, 0, 320, 240); //設定可視 hr=m_pVW->put_Visible(OATRUE); if (FAILED(hr)) return false; //將物件加入到運行物件列表中 CComPtr pROT; GetRunningObjectTable(0,&pROT); WCHAR c[128]; wsprintfW(c, L"FilterGraph x pid x\0", (DWORD_PTR)m_pGraph.p, GetCurrentProcessId()); hr = CreateItemMoniker(L"!",c,&pM); if (FAILED(hr)) return false; hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE,m_pGraph,pM,&m_dwGraphRegister); pM.Release(); return false; }
------
︿︿
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-01 21:28:57 IP:140.135.xxx.xxx 未訂閱
cmf您好:     請問在使用此方式前,準備步驟為何? 能否請您詳細的說明一下< >< > 謝謝您 順心
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-06 15:18:18 IP:61.218.xxx.xxx 未訂閱
引言: cmf您好: 請問在使用此方式前,準備步驟為何? 能否請您詳細的說明一下< >< > 謝謝您 順心
關於準備步驟 請先下載 支援 BCB 的 DIRECTSHOW 的相關 HPP 檔案 然後就可服用
------
︿︿
jvory2k
一般會員


發表:2
回覆:5
積分:1
註冊:2003-12-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-04 13:07:05 IP:140.128.xxx.xxx 未訂閱
我將上面的程式碼改成用BCB6寫,但是在 hr=m_pCapture->RenderStream &PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pBf,NULL,NULL); 這個地方會出現下面的錯誤訊息 [Linker Error] Unresolved external '_MEDIATYPE_Video' referenced from D:\THOMAS\PROJECTS\BCB6\DIRECTSHOW_STUDY\UNIT1.OBJ [Linker Error] Unresolved external '_PIN_CATEGORY_PREVIEW' referenced from D:\THOMAS\PROJECTS\BCB6\DIRECTSHOW_STUDY\UNIT1.OBJ 請問是什麼原因呢?
trans0926
一般會員


發表:3
回覆:3
積分:1
註冊:2005-06-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-19 10:44:13 IP:163.28.xxx.xxx 未訂閱
引言: 關於準備步驟 請先下載 支援 BCB 的 DIRECTSHOW 的相關 HPP 檔案 然後就可服用
請問是下載這些檔案是由擷取卡所提供的嗎~ 還是到哪裡下載呢~~ =======我是新手希望各位前輩能大方指導,謝謝=================
系統時間:2024-05-18 6:36:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!