VC捕捉攝像頭圖像入門源碼要點(diǎn)

上傳人:無*** 文檔編號(hào):32406970 上傳時(shí)間:2021-10-14 格式:DOCX 頁數(shù):16 大小:41.69KB
收藏 版權(quán)申訴 舉報(bào) 下載
VC捕捉攝像頭圖像入門源碼要點(diǎn)_第1頁
第1頁 / 共16頁
VC捕捉攝像頭圖像入門源碼要點(diǎn)_第2頁
第2頁 / 共16頁
VC捕捉攝像頭圖像入門源碼要點(diǎn)_第3頁
第3頁 / 共16頁

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《VC捕捉攝像頭圖像入門源碼要點(diǎn)》由會(huì)員分享,可在線閱讀,更多相關(guān)《VC捕捉攝像頭圖像入門源碼要點(diǎn)(16頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、【轉(zhuǎn)】VC捕捉攝像頭圖像入門源碼VC捕捉攝像頭圖像入門源碼(非常適合新手)(轉(zhuǎn))默認(rèn)分類2009-11-02 17:46:56 閱讀39評(píng)論0字號(hào):大中 小此源碼是我更改過的基于 VFW(Video for Windows)的源碼,使用了定時(shí)器能 實(shí)時(shí)的顯示圖像,從網(wǎng)上可搜到原版源碼,但是原版的功能是保存為一個(gè)文件, 且不能實(shí)時(shí)顯示,此版本雖然能顯示,但感覺反應(yīng)速度不是很快,沒有基于 DirectShow的程序更新速度快,不過在 WM_PAINT息處理里加while(1)capGrabFrame(ghWndCap);刷新速度就快很多了,但是這樣程序就進(jìn) 入死循環(huán)不能再處理其他消息,至于怎樣改進(jìn)

2、,就靠讀者你了。/源碼的任何部分都可以在 MSDN!查至IJ,請(qǐng)參考 MSDN#include #include #include #pragma comment(lib,vfw32.lib)HWND ghWndCap ; /f甫獲窗的句柄CAPSTATUS gCapStatus ; / 捕獲窗的狀態(tài)CAPDRIVERCAPS gCapDriverCaps ; 視頻驅(qū)動(dòng)的能力 char gachBuffer20;/char szCaptureFile口 = CamCapture.AVI;/ / StatusCallbackProc: 冊(cè)這個(gè)回調(diào)函數(shù)。/ hWnd:/ nID:/ lpStatu

3、sText:狀態(tài)回調(diào)函數(shù),使用capSetCallbackOnStatus 宏來注捕獲窗體句柄當(dāng)前狀態(tài)的狀態(tài)碼 當(dāng)前狀態(tài)的文本字符/LRESULT CALLBACK StatusCallbackProc(HWND hWnd,int nID,LPSTR lpStatusText)if(!ghWndCap)return FALSE;/獲得捕獲窗的狀態(tài)capGetStatus(ghWndCap,&gCapStatus,sizeof(CAPSTATUS);/ 更新捕獲窗的大小 , 得到消息 WM_CAP_GET_STATUSSetWindowPos(ghWndCap,NULL,0,0,gCapStat

4、us.uiImageWidth,gCapStatus.uiI mageHeight,SWP_NOZORDER|SWP_NOMOVE);if(nID=0)/ 清除舊的狀態(tài)信息SetWindowText(ghWndCap,(LPSTR)hello);return (LRESULT)TRUE;/ 顯示狀態(tài) ID 和狀態(tài)文本wsprintf(gachBuffer,Status# %d: %s,nID,lpStatusText);SetWindowText(ghWndCap,(LPSTR)gachBuffer);return (LRESULT)TRUE;/ ErrorCallbackProc:錯(cuò)誤回調(diào)函

5、數(shù), 過 capSetCallbackOnError 宏來 注冊(cè)回調(diào)捕獲窗口句柄錯(cuò)誤代碼關(guān)于錯(cuò)誤的文本信息/ hWnd:/ nErrID: / lpErrorText: /LRESULT CALLBACK ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText)if(!ghWndCap)return FALSE;if(nErrID=0)return TRUE;/ 清除舊的錯(cuò)誤wsprintf(gachBuffer,Error# %d,nErrID);/ 顯示錯(cuò)誤標(biāo)識(shí)和文本MessageBox(hWnd, lpErrorText, gac

6、hBuffer,MB_OK | MB_ICONEXCLAMATION); return (LRESULT) TRUE;/ FrameCallbackProc: 幀回調(diào)函數(shù), 通過 capSetCallbackFrame 宏來注冊(cè)捕獲窗體句柄指向一個(gè)包含幀信息的數(shù)據(jù)結(jié)構(gòu)體回調(diào)函數(shù)/ hWnd:/ lpVHdr: / /LRESULT CALLBACK FrameCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr) FILE *fp;fp=fopen(caram.dat,w);if(!ghWndCap)return FALSE;/ 假設(shè) fp 為一打開的 .dat 文

7、件指針fwrite(lpVHdr-lpData,1,lpVHdr-dwBufferLength,fp); return (LRESULT)TRUE;/ /TimerProc 函數(shù)處理定時(shí)器,在這里抓取并顯示圖像/VOID CALLBACK TimerProc(HWND hwnd,/ handle to windowUINT uMsg,/ WM_TIMER messageUINT_PTR idEvent, / timer identifierDWORD dwTime/ current system time)capGrabFrame(ghWndCap);/ 主回調(diào)函數(shù)/LRESULT CALLB

8、ACK WindowProc(HWND hwnd,/ handle to windowUINT uMsg,/ message identifierWPARAM wParam, / first message parameter LPARAM lParam / second message parameter )/ HDC hdc;/ PAINTSTRUCT ps;/ RECT rect;switch(uMsg)case WM_CREATE:ghWndCap=capCreateCaptureWindow(LPSTR)Capture Window,WS_CHILD|WS_VISIBLE,0,0,3

9、20,240,(HWND)hwnd,(int)0);capSetCallbackOnError(ghWndCap,(FARPROC)ErrorCallbackProc);capSetCallbackOnStatus(ghWndCap,(FARPROC)StatusCallbackProc); capSetCallbackOnFrame(ghWndCap,(FARPROC)FrameCallbackProc);capDriverConnect(ghWndCap,0); / 將捕獲窗同驅(qū)動(dòng)連接capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPD

10、RIVERCAPS);/ 獲得驅(qū)動(dòng)的能力 , 相關(guān)的信息放在結(jié)構(gòu)變量gCapDriverCaps 中capPreviewRate(ghWndCap, 66); /uses this macro to set the framedisplay rate for preview mode to 66 milliseconds per framecapPreview(ghWndCap, TRUE); /and then uses the capPreview macro to place the capture window in preview mode.if(gCapDriverCaps.fHa

11、sOverlay) / 檢查驅(qū)動(dòng)器是否有疊加能力capOverlay(ghWndCap,TRUE); / 啟動(dòng) Overlay 模式if(gCapDriverCaps.fHasDlgVideoSource)capDlgVideoSource(ghWndCap);/Video source 對(duì)話框if(gCapDriverCaps.fHasDlgVideoFormat)capDlgVideoFormat(ghWndCap);/ Video format 對(duì)話框if(gCapDriverCaps.fHasDlgVideoDisplay)capDlgVideoDisplay(ghWndCap); /

12、 Video display 對(duì)話框/ capFileSetCaptureFile( ghWndCap,szCaptureFile); / 將要保存的文件名設(shè)為本源文件開頭處的全局字符串常量/ capFileAlloc(ghWndCap, (1024L * 1024L * 5); / 為捕獲文件分配存儲(chǔ)空間capCaptureSequence(ghWndCap); / 開始捕獲視頻序列/ capGrabFrame(ghWndCap); / 捕獲單幀圖像SetTimer(hwnd,1,10,TimerProc);break;case WM_PAINT:capGrabFrame(ghWndCap)

13、;/* hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,TEXT(Hello,WindowsXP!),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);EndPaint(hwnd,&ps);*/break;case WM_CLOSE: if(IDYES=MessageBox(hwnd,Sure exit ?,CamCapture,MB_YESNO) DestroyWindow(hwnd); break;case WM_DESTROY:KillTimer(hwnd,1);cap

14、SetCallbackOnStatus(ghWndCap,NULL); capSetCallbackOnError(ghWndCap,NULL); capSetCallbackOnFrame(ghWndCap,NULL); capCaptureAbort(ghWndCap);/ 停止捕獲 capDriverDisconnect(ghWndCap); / 將捕獲窗同驅(qū)動(dòng)斷開 PostQuitMessage(0); break;default:return DefWindowProc(hwnd,uMsg,wParam,lParam); return 0;/ 主函數(shù)int WINAPI WinMai

15、n(HINSTANCE hInstance,/ handle to currentinstanceHINSTANCE hPrevInstance, / handle to previous instanceLPSTR lpCmdLine,/ command lineint nCmdShow/ show state) static TCHAR szAppName=TEXT(CamCapture); WNDCLASS wndcls; HWND hwnd; MSG msg;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackground=(HB

16、RUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_QUESTION); wndcls.hInstance=hInstance;wndcls.lpfnWndProc=WindowProc;wndcls.lpszClassName=CamCapture;wndcls.lpszMenuName=NULL;wndcls.style=CS_HREDRAW | CS_VREDRAW;if(!RegisterClass(&wndcls)Mess

17、ageBox(NULL,TEXT(This program requires Windows NT!),szAppName,MB_ICONERROR);return 0;hwnd=CreateWindow(CamCapture,CamCapture,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,320,240,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0)TranslateMessage

18、(&msg);DispatchMessage(&msg);return 0;摘要: 本文主要講述用 Directshow 進(jìn)行視頻捕捉 (捕捉靜態(tài)圖像) 的編程思路,并提供針對(duì)攝像頭編程的一個(gè)視頻捕捉類CcaptureVideo 和一個(gè)示例。、戶 、.前言DirectShow是微軟公司提供的一套在 Windows平臺(tái)上進(jìn)行流媒體處理的開發(fā)包,與 DirectX 開發(fā)包一起發(fā)布。 DirectShow 為多媒體流的捕捉和回放提供了強(qiáng)有力的支持。用 DirectShow 開發(fā)應(yīng)用程序,我們可以很方便地從支持WDM驅(qū)動(dòng)模型的采集卡上捕獲數(shù)據(jù),并且進(jìn)行相應(yīng)的后期處理乃至存儲(chǔ)到文件中。DirectSho

19、w是基于COM勺,為了編寫 DirectShow應(yīng)用程序,需要了解 COM客戶程序編寫的基礎(chǔ)知識(shí)。 DirectShow 提供了大量的接口,但在編程中發(fā)現(xiàn)還是不夠方便, 如果能構(gòu)建一個(gè)視頻捕捉類把常用的一些動(dòng)作封裝起來, 那么就更方便了。編程思路為了更加容易建立視頻捕捉應(yīng)用程序, DirectShow 提供了一個(gè)叫做CaptureGraph Builder 的對(duì)象, Capture Graph Builder 提供 IcaptureGraphBuilder2 接口,該接口可以建立和控制 Capture Graph 。建立視頻捕捉程序,必須首先獲取并初始化 IcaptureGraphBuilde

20、r2 接口,然后選擇一個(gè)適當(dāng)?shù)囊曨l捕捉設(shè)備。選擇好設(shè)備后,為該設(shè)備創(chuàng)建Capturefilter ,然后調(diào)用 AddFilter 把 Capture filter 添加到 Filter Graph 。如果僅僅希望用攝像頭來進(jìn)行實(shí)時(shí)監(jiān)控的話,只需要在上面的基礎(chǔ)上調(diào)用ICaptureGraphBuilder2:RenderStream 就可以了:ICaptureGraphBuilder2 *pBuild; / Capture Graph Builder/ 省略初始化部分代碼IBaseFilter *pCap; / Video capture filter./ 省略初始化和添加到 Filter Gr

21、aph 部分代碼pBuild-RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);DirectShow 提供了一個(gè)捕捉靜態(tài)圖像的方法: 使用 SampleGrabber filter 。依次按照以下三個(gè)步驟就可以了:第一步 , 定義一個(gè)類實(shí)現(xiàn)Sample Grabber 的回調(diào)接口 IsampleGrabberCB :class CSampleGrabberCB : public ISampleGrabberCB / 在后面提供的類中具體完成CSampleGrabberCB mCB;第二步、調(diào)用 Ren

22、derStream 依次把 Still pin 、 Sample Grabber 和系統(tǒng)默 認(rèn) Renderer Filter 連接起來。第三步、配置Sample Grabber 以捕獲數(shù)據(jù)。視頻捕捉類CCaptureVideo 的具體實(shí)現(xiàn)/ CCaptureVideo 視頻捕捉類頭文件/#if !defined(AFX_CAPTUREVIDEO_H_F5345AA4_A39F_4B07_B843_3D87C4287AA0 _INCLUDED_)#defineAFX_CAPTUREVIDEO_H_F5345AA4_A39F_4B07_B843_3D87C4287AA0_INCLUDED_ /

23、CaptureVideo.h : header file/#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include #include #include #ifndef SAFE_RELEASE#define SAFE_RELEASE( x ) if ( NULL != x ) x-Release( ); x = NULL; #endifclass CSampleGrabberCB;class CCaptureVideo : public CWndfriend class CSampleGrabberCB;public:void Gr

24、abOneFrame(BOOL bGrab);HRESULT Init(int iDeviceID,HWND hWnd);int EnumDevices(HWND hList);CCaptureVideo();virtual CCaptureVideo();private:HWND m_hWnd;IGraphBuilder *m_pGB;ICaptureGraphBuilder2* m_pCapture;IBaseFilter* m_pBF;IMediaControl* m_pMC;IVideoWindow* m_pVW;CComPtr m_pGrabber;protected:void Fr

25、eeMediaType(AM_MEDIA_TYPE& mt);bool BindFilter(int deviceId, IBaseFilter *pFilter);void ResizeVideoWindow();HRESULT SetupVideoWindow();HRESULT InitCaptureGraphBuilder();#endif/ !defined(AFX_CAPTUREVIDEO_H_F5345AA4_A39F_4B07_B843_3D87C4287AA0_INCLUDED_)/ CCaptureVideo 視頻捕捉類實(shí)現(xiàn)文件 CaptureVideo.cpp/ Capt

26、ureVideo.cpp: implementation of the CCaptureVideo class./#include stdafx.h#include CaptureVideo.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endifBOOL bOneShot=FALSE;/全局變量class CSampleGrabberCB : public ISampleGrabberCBpublic:long lWidth;long lHeight;TCHAR m_szFil

27、eNameMAX_PATH;位圖文件名稱CSampleGrabberCB( )strcpy(m_szFileName, c:donaldo.bmp);STDMETHODIMP_(ULONG) AddRef() return 2; STDMETHODIMP_(ULONG) Release() return 1; STDMETHODIMP QueryInterface(REFIID riid, void * ppv)if( riid = IID_ISampleGrabberCB | riid = IID_IUnknown )*ppv = (void *) static_cast ( this );

28、return NOERROR;return E_NOINTERFACE;STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample ) return 0;STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )if( !bOneShot )return 0;if (!pBuffer)return E_POINTER;SaveBitmap(pBuffer, lBufferSize);bOneShot = FALSE;retur

29、n 0;/ 創(chuàng)建位圖文件BOOL SaveBitmap(BYTE * pBuffer, long lBufferSize )HANDLE hf = CreateFile(m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,CREATE_ALWAYS, NULL, NULL );if( hf = INVALID_HANDLE_VALUE )return 0;/ 寫文件頭BITMAPFILEHEADER bfh;memset( &bfh, 0, sizeof( bfh ) );bfh.bfType = MB;bfh.bfSize = sizeof(

30、 bfh ) + lBufferSize + sizeof( BITMAPINFOHEAD)E; Rbfh.bfOffBits = sizeof( BITMAPINFOHEADER ) +sizeof( BITMAPFILEHEADER );DWORD dwWritten = 0;WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );/ 寫位圖格式BITMAPINFOHEADER bih;memset( &bih, 0, sizeof( bih ) );bih.biSize = sizeof( bih );bih.biWidth = lW

31、idth;bih.biHeight = lHeight;bih.biPlanes = 1;bih.biBitCount = 24;WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );/ 寫位圖數(shù)據(jù)WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );CloseHandle( hf );return 0;CSampleGrabberCB mCB;/ Construction/Destruction/CCaptureVideo:CCaptureVideo()/COM Library

32、Intializationif(FAILED(CoInitialize(NULL) /*, COINIT_APARTMENTTHREADED)*/AfxMessageBox(CoInitialize Failed!rn);return;m_hWnd = NULL;m_pVW = NULL;m_pMC = NULL;m_pGB = NULL;m_pCapture = NULL;CCaptureVideo:CCaptureVideo()/ Stop media playbackif(m_pMC)m_pMC-Stop();if(m_pVW)m_pVW-put_Visible(OAFALSE);m_p

33、VW-put_Owner(NULL);SAFE_RELEASE(m_pCapture);SAFE_RELEASE(m_pMC);SAFE_RELEASE(m_pGB);SAFE_RELEASE(m_pBF);CoUninitialize( );int CCaptureVideo:EnumDevices(HWND hList)if (!hList)return -1;int id = 0;/ 枚舉視頻撲捉設(shè)備ICreateDevEnum *pCreateDevEnum;HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,CLSCT

34、X_INPROC_SERVER,IID_ICreateDevEnum, (void*)&pCreateDevEnum);if (hr != NOERROR)return -1;CComPtr pEm;hr =pCreateDevEnum-CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);if (hr != NOERROR)return -1;pEm-Reset();ULONG cFetched;IMoniker *pM;while(hr = pEm-Next(1, &pM, &cFetched), hr=S_OK)IP

35、ropertyBag *pBag;hr = pM-BindToStorage(0, 0, IID_IPropertyBag, (void *)&pBag); if(SUCCEEDED(hr)VARIANT var;var.vt = VT_BSTR;hr = pBag-Read(LFriendlyName, &var, NULL);if (hr = NOERROR)TCHAR str2048;id+;WideCharToMultiByte(CP_ACP,0,var.bstrVal, -1, str, 2048, NULL, NULL);:SendMessage(hList, CB_ADDSTRI

36、NG, 0,(LPARAM)str);SysFreeString(var.bstrVal);pBag-Release();pM-Release();return id;HRESULT CCaptureVideo:Init(int iDeviceID, HWND hWnd)HRESULT hr;hr = InitCaptureGraphBuilder();if (FAILED(hr)AfxMessageBox(Failed to get video interfaces!); return hr;/ Bind Device Filter. We know the device because t

37、he id was passed in if(!BindFilter(iDeviceID, &m_pBF)return S_FALSE;hr = m_pGB-AddFilter(m_pBF, LCapture Filter);/ hr = m_pCapture-RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,/ m_pBF, NULL, NULL);/ create a sample grabberhr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );if( !m_pGrabbe

38、r )AfxMessageBox(Fail to create SampleGrabber, maybeqedit.dll is not registered?);return hr;CComQIPtr pGrabBase( m_pGrabber );/ 設(shè)置視頻格式AM_MEDIA_TYPE mt;ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE);mt.majortype = MEDIATYPE_Video;mt.subtype = MEDIASUBTYPE_RGB24;hr = m_pGrabber-SetMediaType(&mt);if( FAILED( hr

39、 ) )AfxMessageBox(Fail to set media type!);return hr;hr = m_pGB-AddFilter( pGrabBase, LGrabber );if( FAILED( hr ) )AfxMessageBox(Fail to put sample grabber in graph);return hr;/ try to render preview/capture pinhr = m_pCapture-RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL

40、);if( FAILED( hr ) )hr = m_pCapture-RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);if( FAILED( hr ) )AfxMessageBox(Can t build the graph);return hr;hr = m_pGrabber-GetConnectedMediaType( &mt );if ( FAILED( hr) )AfxMessageBox(Failt to read the connected media type);return

41、hr;VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;mCB.lWidth = vih-bmiHeader.biWidth;mCB.lHeight = vih-bmiHeader.biHeight;FreeMediaType(mt);hr = m_pGrabber-SetBufferSamples( FALSE );hr = m_pGrabber-SetOneShot( FALSE );hr = m_pGrabber-SetCallback( &mCB, 1 );/ 設(shè)置視頻捕捉窗口m_hWnd = hWnd ;SetupVideo

42、Window();hr = m_pMC-Run();/ 開始視頻捕捉if(FAILED(hr)AfxMessageBox(Couldn t run the graph!);return hr; return S_OK;bool CCaptureVideo:BindFilter(int deviceId, IBaseFilter *pFilter)if (deviceId 0) return false;/ enumerate all video capture devicesCComPtr pCreateDevEnum;HRESULT hr = CoCreateInstance(CLSID_S

43、ystemDeviceEnum, NULL,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void*)&pCreateDevEnum);if (hr != NOERROR)return false;CComPtr pEm;hr =pCreateDevEnum-CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);if (hr != NOERROR)return false;pEm-Reset();ULONG cFetched;IMoniker *pM;int index = 0;whi

44、le(hr = pEm-Next(1, &pM, &cFetched), hr=S_OK, index BindToStorage(0, 0, IID_IPropertyBag, (void *)&pBag); if(SUCCEEDED(hr)VARIANT var;var.vt = VT_BSTR;hr = pBag-Read(LFriendlyName, &var, NULL);if (hr = NOERROR)if (index = deviceId)pM-BindToObject(0, 0, IID_IBaseFilter, (void*)pFilter);SysFreeString(

45、var.bstrVal);pBag-Release();pM-Release();index+;return true;HRESULT CCaptureVideo:InitCaptureGraphBuilder()HRESULT hr;/ 創(chuàng)建 IGraphBuilder 接口hr=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void *)&m_pGB);/ 創(chuàng)建 ICaptureGraphBuilder2 接口hr = CoCreateInstance (CLSID_C

46、aptureGraphBuilder2 , NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (void *) &m_pCapture);if (FAILED(hr)return hr;m_pCapture-SetFiltergraph(m_pGB);hr = m_pGB-QueryInterface(IID_IMediaControl, (void *)&m_pMC);if (FAILED(hr)return hr;hr = m_pGB-QueryInterface(IID_IVideoWindow, (LPVOID *) &m_pVW);if (F

47、AILED(hr)return hr;return hr;HRESULT CCaptureVideo:SetupVideoWindow()HRESULT hr;hr = m_pVW-put_Owner(OAHWND)m_hWnd);if (FAILED(hr)return hr;hr = m_pVW-put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);if (FAILED(hr)return hr;ResizeVideoWindow();hr = m_pVW-put_Visible(OATRUE);return hr;void CCaptureVideo:R

48、esizeVideoWindow()if (m_pVW)/ 讓圖像充滿整個(gè)窗口CRect rc;:GetClientRect(m_hWnd,&rc);m_pVW-SetWindowPosition(0, 0, rc.right, rc.bottom);void CCaptureVideo:GrabOneFrame(BOOL bGrab)bOneShot = bGrab;void CCaptureVideo:FreeMediaType(AM_MEDIA_TYPE& mt)if (mt.cbFormat != 0) CoTaskMemFree(PVOID)mt.pbFormat);/ Strict

49、ly unnecessary but tidiermt.cbFormat = 0;mt.pbFormat = NULL;if (mt.pUnk != NULL) mt.pUnk-Release();mt.pUnk = NULL; 如何使用視頻捕捉類CCaptureVideo構(gòu)建 CCaptureVideo 類以后, 使用就方便多了, 我們?cè)诰幊讨兄恍枰且旅嫒齻€(gè)類成員函數(shù)就可以實(shí)現(xiàn)用攝像頭進(jìn)行視頻捕捉:int EnumDevices(HWND hList); hList是下拉列表框的句柄,本函數(shù)用于枚舉當(dāng)前系統(tǒng)安裝的所有視頻捕捉設(shè)備 HRESULT Init(int iDeviceID,HW

50、ND hWnd); /iDeviceID 是視頻捕捉設(shè)備 序號(hào),hWn配視頻捕捉窗口的句柄 void GrabOneFrame(BOOL bGrab);/ 調(diào)用 GrabOneFrame(true) 就可以捕 獲當(dāng)前的靜態(tài)圖像并保存到硬盤上具體示例:用MFC AppWizard(exe)創(chuàng)建一個(gè)對(duì)話框應(yīng)用程序,取名為 ds, 給對(duì)話框添加一個(gè)下拉列表框(IDC_COMBO1)兩個(gè)按鈕(IDC_PHOTO IDC_HAVEALOOK一個(gè) Picture 控件(ID:IDC_STATIC_SCREEType: Rectangle , Color:Gray )。1、使用向?qū)砑映蓡T變量CStatic

51、 m_staticScreen; / IDC_STATIC_SCREEN CComboBox m_ListCtrl; / IDC_COMBO1 CCaptureVideo m_cap;2、為 BOOL CDsDlg:OnInitDialog() 添加如下代碼:/ TODO: Add extra initialization here m_cap.EnumDevices (m_ListCtrl);m_ListCtrl.SetCurSel (0);3、為確定按鈕添加代碼如下:void CDsDlg:OnOK()/ 只需要四行代碼就可以進(jìn)行視頻捕捉了UpdateData();HWND hWnd = m_staticScreen.GetSafeHwnd() ;HRESULT hr = m_cap.Init(m_ListCtrl.GetCurSel (),hWnd);GetDlgItem(IDOK)-EnableWindow(FALSE);4、如果希望捕捉靜態(tài)圖像,為照相按鈕添加如下代碼:void CDsDlg:OnPhoto()m_cap.GrabOneFrame(true);

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!