將Panel的DoubleBuffered設為true,畫面仍會閃爍? |
缺席
|
sunwingman
一般會員 發表:26 回覆:47 積分:14 註冊:2008-05-14 發送簡訊給我 |
我透過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 發送簡訊給我 |
不知道你所謂的閃爍的真正狀況
可能要考慮 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 發送簡訊給我 |
先謝謝 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,似乎也沒有用!
編輯記錄
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |