视频问题,从摄像头流中捕捉一张图片。用ISampleGrabber方法 (by Atomictry(天影))
//函数说明 /* * 本地显示函数 */ HRESULT StartDisplay(HWND hwnd); /* * 建立链路 */ HRESULT BuilderGraph() /* * 拍照 */ HRESULT SnapStill() /* * 修改摄像头分辨率,色深,频率 */ BOOL SetFormat(ICaptureGraphBuilder2* pBuilder, IBaseFilter* pCap, long lWidth, long lHeight, unsigned short iColorBit, __int64 iRate ) HRESULT StartDisplay(HWND hwnd) { HRESULT hr = S_OK; hr = BuilderGraph(); if(hr==S_FALSE) return S_FALSE; //Create Display Windows pSendWindow->put_Owner((OAHWND)hwnd); pSendWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); pSendWindow->SetWindowPosition(0,0,250,250); pSendWindow->put_Visible(OATRUE); hr = pGrabber->SetOneShot(FALSE); hr = pGrabber->SetBufferSamples(TRUE); //Begin display hr=pSendControl->Run(); Sleep(500); SnapStill(); return S_OK; } HRESULT BuilderGraph() { HRESULT hr=S_OK; pSendGraph=NULL; pCaputerFilter=NULL; pCaputerBuilder=NULL; pSendWindow=NULL; pSendControl=NULL; pSendEvent=NULL; pGrabberSample = NULL; //1.Builder Filter Graph hr=CoCreateInstance((REFCLSID)CLSID_FilterGraph,NULL, CLSCTX_INPROC_SERVER, (REFIID)IID_IGraphBuilder, (void**)&pSendGraph); if(FAILED(hr)) return S_FALSE; //2.Builder Caputer Filter hr=CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL, CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (void**)&pCaputerBuilder); if(FAILED(hr)) return S_FALSE; //3.Builder SampleGrabber Filter hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pGrabberSample); if(FAILED(hr)) return S_FALSE; hr=pCaputerBuilder->SetFiltergraph(pSendGraph); if(FAILED(hr))return S_FALSE; //Find Caputer Filter hr=FindCaputerDevice(); if(FAILED(hr)) { SAFE_RELEASE(pCaputerBuilder); SAFE_RELEASE(pSendGraph); return S_FALSE; } hr =pSendGraph->AddFilter(pNetSend,NULL); hr =pSendGraph->AddFilter(pCaputerFilter,L"Caputer Filter"); hr =pSendGraph->AddFilter(pCompressor,L"Compressor Filter"); hr = pSendGraph->AddFilter(pGrabberSample, L"Sample Grabber"); hr=pSendGraph->QueryInterface(IID_IMediaControl,(void**)&pSendControl); if(FAILED(hr)) return S_FALSE; hr=pSendGraph->QueryInterface(IID_IVideoWindow,(void**)&pSendWindow); if(FAILED(hr)) return S_FALSE; hr=pSendGraph->QueryInterface(IID_IMediaEvent,(void**)&pSendEvent); if(FAILED(hr)) return S_FALSE; hr=pGrabberSample->QueryInterface(IID_ISampleGrabber, (void**)&pGrabber); if(FAILED(hr)) return S_FALSE; // 修改分辨率 SetFormat(pCaputerBuilder, pCaputerFilter, 640, 480, 24, 30); //Display local video hr=pCaputerBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,NULL,pCaputerFilter,pGrabberSample,NULL); if(FAILED(hr)) return S_FALSE; return S_OK; } HRESULT SnapStill() { HRESULT hr; long cbBuffer = 0; hr = pGrabber->GetCurrentBuffer(&cbBuffer, NULL); if(FAILED(hr)) return E_FAIL; char *pBuffer = new char[cbBuffer]; if (!pBuffer) { // Deal Out of memory. Return an error code. } hr = pGrabber->GetCurrentBuffer(&cbBuffer, (long*)pBuffer); if(FAILED(hr)) return E_FAIL; //生成Bitmap AM_MEDIA_TYPE mt; hr = pGrabber->GetConnectedMediaType(&mt); if (FAILED(hr)) return E_FAIL; VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)mt.pbFormat; if(pVideoHeader==NULL) return E_FAIL; BITMAPINFO BitmapInfo; ZeroMemory(&BitmapInfo, sizeof(BitmapInfo)); CopyMemory(&BitmapInfo.bmiHeader, &(pVideoHeader->bmiHeader), sizeof(BITMAPINFOHEADER)); HBITMAP hBitmap; hBitmap = ::CreateDIBitmap(::GetDC(NULL), &(pVideoHeader->bmiHeader), CBM_INIT, pBuffer, &BitmapInfo, DIB_RGB_COLORS); if(hBitmap==NULL) return E_FAIL; CString strSaveFileName=""; CFileDialog filedlg(FALSE,_T("bmp"),_T(""),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("BMP(*.bmp)")); if(filedlg.DoModal()==IDOK){ strSaveFileName=filedlg.GetPathName(); SaveBitmapToFile(hBitmap,strSaveFileName.GetBuffer(0)); } return hr; } BOOL SetFormat(ICaptureGraphBuilder2* pBuilder, IBaseFilter* pCap, long lWidth, long lHeight, unsigned short iColorBit, __int64 iRate ) { VIDEOINFOHEADER* phead; IAMStreamConfig* iconfig; HRESULT hr; hr = pBuilder -> FindInterface( &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Interleaved, pCap, IID_IAMStreamConfig, (void **)&iconfig ); if ( hr != NOERROR ) { hr = pBuilder -> FindInterface( &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, IID_IAMStreamConfig, (void **)&iconfig); } if ( FAILED( hr ) ) return FALSE; AM_MEDIA_TYPE* pmt; if ( iconfig -> GetFormat( &pmt ) != S_OK ) return FALSE; if ( pmt -> formattype == FORMAT_VideoInfo) { phead = ( VIDEOINFOHEADER* )pmt -> pbFormat; phead -> bmiHeader.biBitCount = iColorBit; phead -> bmiHeader.biWidth = lWidth; phead -> bmiHeader.biHeight = lHeight; phead -> bmiHeader.biSizeImage = lWidth * lHeight * iColorBit / 8; phead -> AvgTimePerFrame = iRate; if ( ( hr = iconfig -> SetFormat( pmt ) ) != S_OK ) return FALSE; } iconfig -> Release(); iconfig = NULL; FreeMediaType( *pmt ); return TRUE; }
作者:vivo 互聯網數據庫團隊- Qiu Xinbo 本文主要通過圖示介紹了用主鍵進行分片查詢的過程,介紹了主鍵分頁查詢存在SQL性能問題,如何去創建高效的索引去優化主鍵分頁查詢的SQL性能問題 對於數據分佈不均
本文分享自華爲雲社區《【MySQL技術專欄】MySQL8.0直方圖介紹》,作者:GaussDB 數據庫。 背景 數據庫查詢優化器負責將SQL查詢轉換爲儘可能高效的執行計劃,但因爲數據環境不斷變化導致優化器對查詢數據瞭解的不夠充足,可能無法
每篇一句 大魔王張怡寧:女兒,這堆金牌你拿去玩吧,但我的銀牌不能給你玩。你要想玩銀牌就去找你王浩叔叔吧,他那銀牌多 前言 爲了講述好Spring MVC最爲複雜的數據綁定這塊,我前面可謂是做足了功課,對此部分知識此處給小夥伴留一個學
JSON簡介: JSON(Java Script Object Notation)是一種輕量級的數據交換格式,通常用於在不同系統之間傳輸數據。它基於 JavaScript 對象語法,但已成爲一種獨立於語言的格式。JSON 數據以鍵值對的形式
一、簡單介紹: CaffeineCache和Guava的Cache是應用廣泛的本地緩存。 在開發中,爲了達到降低依賴、提高訪問速度的目的。會使用它存儲一些維表接口的返回值和數據庫查詢結果,在有些場景下也會在分佈式緩存上再加上一層本地緩存,
作者:vivo 互聯網大前端團隊 - Ma Lian 本文主要描述了FileProvider,startAnyWhere實現,Parcel不對稱漏洞以及這三者結合產生的漏洞利用實戰,另外闡述了漏洞利用的影響和修復預防措施,這個漏洞波及了
作者:胡安祥 滿幫集團,作爲“互聯網+物流”的平臺型企業,一端承接託運人運貨需求,另一端對接貨車司機,提升貨運物流效率。2021 年美股上市,成爲數字貨運平臺上市第一股。根據公司年報,2021 年,超過 350 萬貨車司機在平臺上完成超 1
在迅速變化的技術領域,本地環境的搭建和調試對於軟件開發的效率和效果至關重要。本文將詳細介紹如何爲Apache DolphinScheduler搭建一個高效的本地開發環境,包括2.x和3.x版本的設置方法。 無論您是初學者還是有經驗的開發者
上篇從服務粒度角度進行了探討,本文繼續從服務內的分層角度探討。 本文的觀點源自我在學習與實踐過程中的深思熟慮,尚處於不斷探索和驗證的階段。希望能“拋磚引玉”,激發更多的討論與交流。讓我們共同進步,在探討與實證中尋求真知。 一、背景 應用
1.安全之Kerberos安全認證 1 Kerberos概述 1.1 什麼是Kerberos Kerberos是一種計算機網絡授權協議,用來在非安全網絡中,對個人通信以安全的手段進行身份認證。這個詞又指麻省理工學院爲這個協議開發的一套計算
本文介紹了 InnoDB 支持哪幾類表鎖,以及它們分別都用在什麼場景下,還介紹了其中兩類表鎖爲什麼要存在。 作者:操盛春,愛可生技術專家,公衆號『一樹一溪』作者,專注於研究 MySQL 和 OceanBase 源碼。 愛可生開源社區出品,
本文分享自華爲雲社區《手拉手入門springboot+kafka》,作者:QGS。 安裝kafka 啓動Kafka本地環境需Java 8+以上 Kafka是一種高吞吐量的分佈式發佈訂閱消息系統,它可以處理消費者在網站中的所有動作流數據。
作者:Seata 社區 Part 1:歡迎大家報名 Apache Seata (incubating) 開源之夏 2024 課題 開源之夏 2024 學生報名期爲 4 月 30 日 - 6 月 3 日,歡迎報名 Apache Seata(i
前言 服務器面對的環境千奇百怪,定位問題消耗了大量的人力成本,如何減少這方面的成本呢,最佳方式就是有一套優秀的排障工具,而可視化分析顯得尤爲重要。m7s console 將致力於打造一款方便實用且美觀的可視化工具,將 m7s 實例的運行狀況