歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOCX文檔下載  

VC捕捉攝像頭圖像入門源碼要點

  • 資源ID:32406970       資源大小:41.69KB        全文頁數(shù):16頁
  • 資源格式: DOCX        下載積分:0積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要0積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
支付說明:
本站最低充值0.01積分,下載本資源后余額將會存入您的賬戶,您可在我的個人中心查看。
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認(rèn)打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請知曉。

VC捕捉攝像頭圖像入門源碼要點

【轉(zhuǎn)】VC捕捉攝像頭圖像入門源碼VC捕捉攝像頭圖像入門源碼(非常適合新手)(轉(zhuǎn))默認(rèn)分類2009-11-02 17:46:56 閱讀39評論0字號:大中 小此源碼是我更改過的基于 VFW(Video for Windows)的源碼,使用了定時器能 實時的顯示圖像,從網(wǎng)上可搜到原版源碼,但是原版的功能是保存為一個文件, 且不能實時顯示,此版本雖然能顯示,但感覺反應(yīng)速度不是很快,沒有基于 DirectShow的程序更新速度快,不過在 WM_PAINT息處理里加while(1)capGrabFrame(ghWndCap);刷新速度就快很多了,但是這樣程序就進(jìn) 入死循環(huán)不能再處理其他消息,至于怎樣改進(jìn),就靠讀者你了。/源碼的任何部分都可以在 MSDN!查至IJ,請參考 MSDN#include <windows.h>#include <stdio.h>#include <vfw.h>#pragma comment(lib,"vfw32.lib")HWND ghWndCap ; /f甫獲窗的句柄CAPSTATUS gCapStatus ; / 捕獲窗的狀態(tài)CAPDRIVERCAPS gCapDriverCaps ; 視頻驅(qū)動的能力 char gachBuffer20;/char szCaptureFile口 = "CamCapture.AVI"/ / StatusCallbackProc: 冊這個回調(diào)函數(shù)。/ hWnd:/ nID:/ lpStatusText:狀態(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,gCapStatus.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:錯誤回調(diào)函數(shù), 過 capSetCallbackOnError 宏來 注冊回調(diào)捕獲窗口句柄錯誤代碼關(guān)于錯誤的文本信息/ hWnd:/ nErrID: / lpErrorText: /LRESULT CALLBACK ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText)if(!ghWndCap)return FALSE;if(nErrID=0)return TRUE;/ 清除舊的錯誤wsprintf(gachBuffer,"Error# %d",nErrID);/ 顯示錯誤標(biāo)識和文本MessageBox(hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION); return (LRESULT) TRUE;/ FrameCallbackProc: 幀回調(diào)函數(shù), 通過 capSetCallbackFrame 宏來注冊捕獲窗體句柄指向一個包含幀信息的數(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 文件指針fwrite(lpVHdr->lpData,1,lpVHdr->dwBufferLength,fp); return (LRESULT)TRUE;/ /TimerProc 函數(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 CALLBACK 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,320,240,(HWND)hwnd,(int)0);capSetCallbackOnError(ghWndCap,(FARPROC)ErrorCallbackProc);capSetCallbackOnStatus(ghWndCap,(FARPROC)StatusCallbackProc); capSetCallbackOnFrame(ghWndCap,(FARPROC)FrameCallbackProc);capDriverConnect(ghWndCap,0); / 將捕獲窗同驅(qū)動連接capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPDRIVERCAPS);/ 獲得驅(qū)動的能力 , 相關(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.fHasOverlay) / 檢查驅(qū)動器是否有疊加能力capOverlay(ghWndCap,TRUE); / 啟動 Overlay 模式if(gCapDriverCaps.fHasDlgVideoSource)capDlgVideoSource(ghWndCap);/Video source 對話框if(gCapDriverCaps.fHasDlgVideoFormat)capDlgVideoFormat(ghWndCap);/ Video format 對話框if(gCapDriverCaps.fHasDlgVideoDisplay)capDlgVideoDisplay(ghWndCap); / Video display 對話框/ capFileSetCaptureFile( ghWndCap,szCaptureFile); / 將要保存的文件名設(shè)為本源文件開頭處的全局字符串常量/ capFileAlloc(ghWndCap, (1024L * 1024L * 5); / 為捕獲文件分配存儲空間capCaptureSequence(ghWndCap); / 開始捕獲視頻序列/ capGrabFrame(ghWndCap); / 捕獲單幀圖像SetTimer(hwnd,1,10,TimerProc);break;case WM_PAINT:capGrabFrame(ghWndCap);/* 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);capSetCallbackOnStatus(ghWndCap,NULL); capSetCallbackOnError(ghWndCap,NULL); capSetCallbackOnFrame(ghWndCap,NULL); capCaptureAbort(ghWndCap);/ 停止捕獲 capDriverDisconnect(ghWndCap); / 將捕獲窗同驅(qū)動斷開 PostQuitMessage(0); break;default:return DefWindowProc(hwnd,uMsg,wParam,lParam); return 0;/ 主函數(shù)int WINAPI WinMain(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=(HBRUSH)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)MessageBox(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(&msg);DispatchMessage(&msg);return 0;摘要: 本文主要講述用 Directshow 進(jìn)行視頻捕捉 (捕捉靜態(tài)圖像) 的編程思路,并提供針對攝像頭編程的一個視頻捕捉類CcaptureVideo 和一個示例。、戶 、.前言DirectShow是微軟公司提供的一套在 Windows平臺上進(jìn)行流媒體處理的開發(fā)包,與 DirectX 開發(fā)包一起發(fā)布。 DirectShow 為多媒體流的捕捉和回放提供了強有力的支持。用 DirectShow 開發(fā)應(yīng)用程序,我們可以很方便地從支持WDM驅(qū)動模型的采集卡上捕獲數(shù)據(jù),并且進(jìn)行相應(yīng)的后期處理乃至存儲到文件中。DirectShow是基于COM勺,為了編寫 DirectShow應(yīng)用程序,需要了解 COM客戶程序編寫的基礎(chǔ)知識。 DirectShow 提供了大量的接口,但在編程中發(fā)現(xiàn)還是不夠方便, 如果能構(gòu)建一個視頻捕捉類把常用的一些動作封裝起來, 那么就更方便了。編程思路為了更加容易建立視頻捕捉應(yīng)用程序, DirectShow 提供了一個叫做CaptureGraph Builder 的對象, Capture Graph Builder 提供 IcaptureGraphBuilder2 接口,該接口可以建立和控制 Capture Graph 。建立視頻捕捉程序,必須首先獲取并初始化 IcaptureGraphBuilder2 接口,然后選擇一個適當(dāng)?shù)囊曨l捕捉設(shè)備。選擇好設(shè)備后,為該設(shè)備創(chuàng)建Capturefilter ,然后調(diào)用 AddFilter 把 Capture filter 添加到 Filter Graph 。如果僅僅希望用攝像頭來進(jìn)行實時監(jiān)控的話,只需要在上面的基礎(chǔ)上調(diào)用ICaptureGraphBuilder2:RenderStream 就可以了:ICaptureGraphBuilder2 *pBuild; / Capture Graph Builder/ 省略初始化部分代碼IBaseFilter *pCap; / Video capture filter./ 省略初始化和添加到 Filter Graph 部分代碼pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);DirectShow 提供了一個捕捉靜態(tài)圖像的方法: 使用 SampleGrabber filter 。依次按照以下三個步驟就可以了:第一步 , 定義一個類實現(xiàn)Sample Grabber 的回調(diào)接口 IsampleGrabberCB :class CSampleGrabberCB : public ISampleGrabberCB / 在后面提供的類中具體完成CSampleGrabberCB mCB;第二步、調(diào)用 RenderStream 依次把 Still pin 、 Sample Grabber 和系統(tǒng)默 認(rèn) Renderer Filter 連接起來。第三步、配置Sample Grabber 以捕獲數(shù)據(jù)。視頻捕捉類CCaptureVideo 的具體實現(xiàn)/ CCaptureVideo 視頻捕捉類頭文件/#if !defined(AFX_CAPTUREVIDEO_H_F5345AA4_A39F_4B07_B843_3D87C4287AA0 _INCLUDED_)#defineAFX_CAPTUREVIDEO_H_F5345AA4_A39F_4B07_B843_3D87C4287AA0_INCLUDED_ / CaptureVideo.h : header file/#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000#include <atlbase.h>#include <windows.h>#include <dshow.h>#ifndef SAFE_RELEASE#define SAFE_RELEASE( x ) if ( NULL != x ) x->Release( ); x = NULL; #endifclass CSampleGrabberCB;class CCaptureVideo : public CWndfriend class CSampleGrabberCB;public:void GrabOneFrame(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<ISampleGrabber> m_pGrabber;protected:void FreeMediaType(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 視頻捕捉類實現(xiàn)文件 CaptureVideo.cpp/ CaptureVideo.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_szFileNameMAX_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<ISampleGrabberCB*> ( this );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;return 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( 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 = lWidth;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 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_pVW->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,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void*)&pCreateDevEnum);if (hr != NOERROR)return -1;CComPtr<IEnumMoniker> 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)IPropertyBag *pBag;hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void *)&pBag); if(SUCCEEDED(hr)VARIANT var;var.vt = VT_BSTR;hr = pBag->Read(L"FriendlyName", &var, NULL);if (hr = NOERROR)TCHAR str2048;id+;WideCharToMultiByte(CP_ACP,0,var.bstrVal, -1, str, 2048, NULL, NULL);:SendMessage(hList, CB_ADDSTRING, 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 the id was passed in if(!BindFilter(iDeviceID, &m_pBF)return S_FALSE;hr = m_pGB->AddFilter(m_pBF, L"Capture 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_pGrabber )AfxMessageBox("Fail to create SampleGrabber, maybeqedit.dll is not registered?");return hr;CComQIPtr< IBaseFilter, &IID_IBaseFilter > 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 ) )AfxMessageBox("Fail to set media type!");return hr;hr = m_pGB->AddFilter( pGrabBase, L"Grabber" );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);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 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 ;SetupVideoWindow();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<ICreateDevEnum> pCreateDevEnum;HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void*)&pCreateDevEnum);if (hr != NOERROR)return false;CComPtr<IEnumMoniker> pEm;hr =pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);if (hr != NOERROR)return false;pEm->Reset();ULONG cFetched;IMoniker *pM;int index = 0;while(hr = pEm->Next(1, &pM, &cFetched), hr=S_OK, index <= deviceId)IPropertyBag *pBag;hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void *)&pBag); if(SUCCEEDED(hr)VARIANT var;var.vt = VT_BSTR;hr = pBag->Read(L"FriendlyName", &var, NULL);if (hr = NOERROR)if (index = deviceId)pM->BindToObject(0, 0, IID_IBaseFilter, (void*)pFilter);SysFreeString(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_CaptureGraphBuilder2 , 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 (FAILED(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:ResizeVideoWindow()if (m_pVW)/ 讓圖像充滿整個窗口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);/ Strictly unnecessary but tidiermt.cbFormat = 0;mt.pbFormat = NULL;if (mt.pUnk != NULL) mt.pUnk->Release();mt.pUnk = NULL; 如何使用視頻捕捉類CCaptureVideo構(gòu)建 CCaptureVideo 類以后, 使用就方便多了, 我們在編程中只需要是要下面三個類成員函數(shù)就可以實現(xiàn)用攝像頭進(jìn)行視頻捕捉:int EnumDevices(HWND hList); hList是下拉列表框的句柄,本函數(shù)用于枚舉當(dāng)前系統(tǒng)安裝的所有視頻捕捉設(shè)備 HRESULT Init(int iDeviceID,HWND hWnd); /iDeviceID 是視頻捕捉設(shè)備 序號,hWn配視頻捕捉窗口的句柄 void GrabOneFrame(BOOL bGrab);/ 調(diào)用 GrabOneFrame(true) 就可以捕 獲當(dāng)前的靜態(tài)圖像并保存到硬盤上具體示例:用MFC AppWizard(exe)創(chuàng)建一個對話框應(yīng)用程序,取名為 ds, 給對話框添加一個下拉列表框(IDC_COMBO1)兩個按鈕(IDC_PHOTO IDC_HAVEALOOK一個 Picture 控件(ID:IDC_STATIC_SCREEType: Rectangle , Color:Gray )。1、使用向?qū)砑映蓡T變量CStatic 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);

注意事項

本文(VC捕捉攝像頭圖像入門源碼要點)為本站會員(無***)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

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

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


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