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

將Panel的DoubleBuffered設為true,畫面仍會閃爍?

缺席
sunwingman
一般會員


發表:26
回覆:47
積分:14
註冊:2008-05-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-03-07 16:23:38 IP:221.169.xxx.xxx 訂閱
我透過diectshow來控制webcam,將畫面擷取到image元件上,然後畫框框
image元件在panel上,而我Panel的DoubleBuffered已設為true,但是畫面還是會閃爍?
我也參考bugmans前輩的文章,在FormCreate中,寫上this->DoubleBuffered=true;
不過依然還是會閃爍,所以想請教各位前輩,感謝!

程式碼如下:

[code cpp]
void __fastcall TMainFm::CameraStart()
{
FilterGraph->ClearGraph();
FilterGraph->Active = false;
Filter->BaseFilter->Moniker = SysDev->GetMoniker(0);
FilterGraph->Active = true;

ICaptureGraphBuilder2 *Graph = NULL; //Graph 宣告
IBaseFilter *SourceFilter = NULL; //soucefilter 宣告
IBaseFilter *VideoFilter = NULL; //VideoFilter 宣告

CheckDSError(FilterGraph->QueryInterface(IID_ICaptureGraphBuilder2, &Graph));
CheckDSError(VideoWindow->QueryInterface(IID_IBaseFilter, &VideoFilter));
CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter));

//改變解析度的程式碼---------------
TPinList *PinList=new TPinList(SourceFilter);
TEnumMediaType *VideoMediaTypes=new TEnumMediaType(PinList->First());
IAMStreamConfig *iconfig = NULL;
CheckDSError(PinList->First()->QueryInterface(IID_IAMStreamConfig,(void **)&iconfig));

//int index=ComboBox2->ItemIndex;
//VideoMediaTypes->Items[解析度號碼]
iconfig->SetFormat(VideoMediaTypes->Items[22]->AMMediaType); //logitech QuickCam Orbit AF
//編號19:1280x1024 24bit
//編號22:1600x1200 24bit
delete PinList;
delete VideoMediaTypes;
//----------------------------------

//擷取Stream的程式碼---------------
IBaseFilter *SampleFilter=NULL;
CheckDSError(SampleGrabber1->QueryInterface(IID_IBaseFilter,&SampleFilter));
//----------------------------------

Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, SampleFilter, VideoFilter);
//Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter);

FilterGraph->Play();
Graph->Release();
VideoFilter->Release();
SourceFilter->Release();
SampleFilter->Release();

}
//---------------------------------------------------------------------------

void __fastcall TMainFm::SampleGrabber1Buffer(TObject *sender,
double SampleTime, Pointer pBuffer, int BufferLen)
{
Application->ProcessMessages();

Image[0]->Canvas->Lock();
SampleGrabber1->GetBitmap(Image[0]->Picture->Bitmap, pBuffer, BufferLen);

Buffer->Assign(Image[0]->Picture->Bitmap);
//預覽時的框框
Image[0]->Canvas->Pen->Color=clLime;
Image[0]->Canvas->Pen->Width=15;
//Image[0]->Canvas->Pen->Mode=pmNotXor;
Image[0]->Canvas->Brush->Style=bsClear;
Image[0]->Canvas->Rectangle(150,200,1110,1000); //1.2的比例

if(IsCapture)
{
Buffer->SaveToFile(ExtractFilePath(Application->ExeName) "Capture" IntToStr(ShotCount) ".bmp"); //抓圖
IsCapture=false;
}

Image[0]->Canvas->Unlock();

}
//---------------------------------------------------------------------------

[/code]


syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-03-08 09:00:33 IP:59.125.xxx.xxx 訂閱
不知道你所謂的閃爍的真正狀況
可能要考慮 webcam 的像素、速率?燈光的形式與顏色?
所形成的影響

===================引 用 sunwingman 文 章===================
我透過diectshow來控制webcam,將畫面擷取到image元件上,然後畫框框
image元件在panel上,而我Panel的DoubleBuffered已設為true,但是畫面還是會閃爍?
我也參考bugmans前輩的文章,在FormCreate中,寫上this->DoubleBuffered=true;
不過依然還是會閃爍,所以想請教各位前輩,感謝!

程式碼如下:

[code cpp]
void __fastcall TMainFm::CameraStart()
{
FilterGraph->ClearGraph();
FilterGraph->Active = false;
Filter->BaseFilter->Moniker = SysDev->GetMoniker(0);
FilterGraph->Active = true;

ICaptureGraphBuilder2 *Graph = NULL; //Graph 宣告
IBaseFilter *SourceFilter = NULL; //soucefilter 宣告
IBaseFilter *VideoFilter = NULL; //VideoFilter 宣告

CheckDSError(FilterGraph->QueryInterface(IID_ICaptureGraphBuilder2, &Graph));
CheckDSError(VideoWindow->QueryInterface(IID_IBaseFilter, &VideoFilter));
CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter));

//改變解析度的程式碼---------------
TPinList *PinList=new TPinList(SourceFilter);
TEnumMediaType *VideoMediaTypes=new TEnumMediaType(PinList->First());
IAMStreamConfig *iconfig = NULL;
CheckDSError(PinList->First()->QueryInterface(IID_IAMStreamConfig,(void **)&iconfig));

//int index=ComboBox2->ItemIndex;
//VideoMediaTypes->Items[解析度號碼]
iconfig->SetFormat(VideoMediaTypes->Items[22]->AMMediaType); //logitech QuickCam Orbit AF
//編號19:1280x1024 24bit
//編號22:1600x1200 24bit
delete PinList;
delete VideoMediaTypes;
//----------------------------------

//擷取Stream的程式碼---------------
IBaseFilter *SampleFilter=NULL;
CheckDSError(SampleGrabber1->QueryInterface(IID_IBaseFilter,&SampleFilter));
//----------------------------------

Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, SampleFilter, VideoFilter);
//Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter);

FilterGraph->Play();
Graph->Release();
VideoFilter->Release();
SourceFilter->Release();
SampleFilter->Release();

}
//---------------------------------------------------------------------------

void __fastcall TMainFm::SampleGrabber1Buffer(TObject *sender,
double SampleTime, Pointer pBuffer, int BufferLen)
{
Application->ProcessMessages();

Image[0]->Canvas->Lock();
SampleGrabber1->GetBitmap(Image[0]->Picture->Bitmap, pBuffer, BufferLen);

Buffer->Assign(Image[0]->Picture->Bitmap);
//預覽時的框框
Image[0]->Canvas->Pen->Color=clLime;
Image[0]->Canvas->Pen->Width=15;
//Image[0]->Canvas->Pen->Mode=pmNotXor;
Image[0]->Canvas->Brush->Style=bsClear;
Image[0]->Canvas->Rectangle(150,200,1110,1000); //1.2的比例

if(IsCapture)
{
Buffer->SaveToFile(ExtractFilePath(Application->ExeName) "Capture" IntToStr(ShotCount) ".bmp"); //抓圖
IsCapture=false;
}

Image[0]->Canvas->Unlock();

}
//---------------------------------------------------------------------------

[/code]


sunwingman
一般會員


發表:26
回覆:47
積分:14
註冊:2008-05-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-03-08 23:38:56 IP:221.169.xxx.xxx 訂閱
先謝謝 Syntax 前輩回覆

因為我有試過,假如把我程式碼中畫框框的地方,如下:


[code cpp]
//預覽時的框框
Image[0]->Canvas->Pen->Color=clLime;
Image[0]->Canvas->Pen->Width=15;
//Image[0]->Canvas->Pen->Mode=pmNotXor;
Image[0]->Canvas->Brush->Style=bsClear;
Image[0]->Canvas->Rectangle(150,200,1110,1000); //1.2的比例

[/code]


如果上面這段程式碼我mark起來,畫面就不會閃
所以我才會覺得跟webcam沒有關係,因為是我在image元件上畫框框時才開始閃
照之前,panel的doublebuffer設為true,應該就不會有這個問題
但是不知道為什麼,這是卻無法這樣解決
所以才想請教各為前輩

ps.我甚至試過把videowindow的doublebuffer也設為true,似乎也沒有用!


編輯記錄
sunwingman 重新編輯於 2010-03-08 23:39:45, 註解 無‧
sunwingman 重新編輯於 2010-03-08 23:40:59, 註解 無‧
系統時間:2024-04-27 2:53:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!