線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1746
推到 Plurk!
推到 Facebook!

DirectShow抓圖

尚未結案
炎峰
一般會員


發表:7
回覆:9
積分:3
註冊:2011-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-08-15 16:39:26 IP:60.244.xxx.xxx 訂閱
 不好意思,之前發的兩次網站都會出錯進不去 >"<
故在重新試一次看看 ~"~

----------------------------------------------------------------------------

各位大大好 :D
小弟專題會用到影像處理
目前已在 VFW 架構下完成主要功能了
礙於速度不佳,我們想要換成 DirectShow 試試看

軟體是 C Builder XE
由於小弟笨拙,DSPack 無法 compiler 成功
於是使用 XE 內建的 DirectShow (可直接 #include )

使用 cppfans 逍遙遊 大大的 BcbPlayCap2010 作為範例修改
已能在 Panel 上顯示畫面

但由於要抓圖下來做處理
我們寫了下面的程式 SampleGrabber (是在已成功連接攝影機、RenderStream後呼叫的程式)

問題在於...
使用 Media Event 的 WaitForCompletion 會卡在那邊,無法往下執行
若使用 Sleep 或不等待,均會出現錯誤 0x80040227

小弟這邊希望能先抓到單圖,後續再去處理連續抓圖、callback 的問題

精簡程式碼如下:


[code cpp]
IVideoWindow * g_pVW;
IMediaControl * g_pMC;
IMediaEventEx * g_pME;
IGraphBuilder * g_pGraph;
ICaptureGraphBuilder2 * g_pCapture;
ISampleGrabber *pGrabber;
HRESULT TForm1::SampleGrabber(void)
{
IBaseFilter *pSG_Filter = NULL;
long cbBuffer = 0;
hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pSG_Filter);
{
return hr;
hr = g_pGraph->AddFilter(pSG_Filter, L"SampleGrab"); // 將 Sample Grabber 加入 filter graph 中
{
return hr;
IBaseFilter *pNull = NULL;
if (FAILED(hr))
Msg(TEXT("Creat NullRenderer com faild! hr=0x%x"), hr);
}
if (FAILED(hr))
Msg(TEXT("Add Filter - NullRenderer Error! hr=0x%x"), hr);
}
HDC hdc = GetDC(NULL);
ReleaseDC(NULL, hdc);
mt.majortype = MEDIATYPE_Video;
{
mt.subtype = MEDIASUBTYPE_RGB8;
case 16:
break;
mt.subtype = MEDIASUBTYPE_RGB24;
case 32:
break;
return E_FAIL;
hr = pSG_Filter->QueryInterface(IID_ISampleGrabber, (void**)&pGrabber);
{
return hr;
hr = pGrabber->SetMediaType(&mt);
{
return hr;
hr = pGrabber->SetOneShot(false);
{
return hr;
hr = pGrabber->SetBufferSamples(true);
{
return hr;
/* 此處為使用 ISampleGrabberCB::BufferCB
CSampleGrabberCB g_StillCapCB;
// 0 → SampleCB , 傳進來的位址是 Sample 原始資料
hr = g_pMC->Run();
{
return hr;
/* 這邊若是使用 Sleep (200~2000 都測過)
會出現錯誤 hr = 0x80040227 (VFW_E_WRONG_STATE)
則是會一直卡在這邊,不會往下執行了 //Sleep(200);
hr = g_pME->WaitForCompletion( INFINITE, &EvCode );
{
return hr;
hr = pGrabber->GetCurrentBuffer(&cbBuffer, NULL);
{
return hr;
if (!pBuffer)
hr = pGrabber->GetCurrentBuffer(&cbBuffer, (long*)pBuffer);
{
return hr;
hr = pGrabber->GetConnectedMediaType(&mt);
{
return hr;
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)mt.pbFormat;
pVih = (VIDEOINFOHEADER*)mt.pbFormat;
{
Msg(TEXT("Couldn't get Video Info Header!"));
}
if( hf == INVALID_HANDLE_VALUE )
BITMAPFILEHEADER bfh;
bfh.bfType = 0x4D42;
bfh.bfOffBits = sizeof(BITMAPINFOHEADER) sizeof( BITMAPFILEHEADER );
WriteFile( hf, &bfh, sizeof( bfh ), &Written, NULL );
BITMAPINFOHEADER bih;
bih.biSize = sizeof( bih );
bih.biHeight = pVih->bmiHeader.biHeight;
bih.biBitCount = pVih->bmiHeader.biBitCount;
WriteFile( hf, &bih, sizeof( bih ), &Written, NULL );
WriteFile(hf, pBuffer, sizeof( pBuffer ), &Written, NULL);
FreeMediaType(mt);
SafeRelease(pGrabber);
delete tmp;
return S_OK;
}
[/code]

問題就是這樣...
還請大大們指點迷津 :(

如是小弟爬文不力或是犯了低級錯誤請大大們用力鞭 ^^


系統時間:2024-11-21 19:55:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!