畫面閃爍 |
答題得分者是:taishyang
|
kkk1225
一般會員 發表:7 回覆:14 積分:4 註冊:2010-03-02 發送簡訊給我 |
請教各位一下,當擷取攝影機畫面到Image1上(1秒30張),再另外擷取攝影機畫面到Image2上(1秒20張),
之後再把2個畫面相減,找出移動物體的部份顯示在Image3上,都是即時動態方式呈現, 但是執行完後,找出移動物體部分會一直閃爍,請問有什麼方式可以不讓畫面一直閃爍。 我參考過文章是加上 Form1->DoubleBuffered=true ; Panel1->DoubleBuffered=true ; 但是加上之後,還是會一直閃爍。 ps: 擷取攝影機畫面到Image是用Timer元件的方式。 多多指導一下,謝謝
------
多多指教 |
kkk1225
一般會員 發表:7 回覆:14 積分:4 註冊:2010-03-02 發送簡訊給我 |
不好意思,假如改成連續影像畫面上一張減掉下一張的方法,例如第2張減第1張,第3張減第2張,以此類推。
當程式執行後,影像畫面有白點閃爍。請問有什麼方法可以使它消失。 感謝各位指導一下,謝謝 [code cpp] #include #pragma hdrstop #include #include #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; HWND cap1; //設定攝影機名稱 int count=0; //畫面計數 //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- { cap1=capCreateCaptureWindow( "My cap", WS_CHILD | WS_VISIBLE, 0,0,Panel1->Width, Panel1->Height, Panel1->Handle, 0); //建立視訊擷取視窗 capDriverConnect( cap1,0 ); //連接攝影機 capPreview(cap1,true); //擷取影像出現在視窗中 capPreviewScale(cap1,true); //使影像延伸到所設定的視窗大小 capPreviewRate(cap1, 1000/30); //影像張數變化速率 } //--------------------------------------------------------------------------- void __fastcall TForm1::N7Click(TObject *Sender) { capDriverDisconnect(cap1); //停止攝影機 } //--------------------------------------------------------------------------- void __fastcall TForm1::N9Click(TObject *Sender) //擷取攝影機視窗到影像 1 { Timer2->Interval=1000/30; Timer2->Enabled =true; } //--------------------------------------------------------------------------- void __fastcall TForm1::binaryClick(TObject *Sender) //二值化 { Timer1->Interval=1000/15; Timer1->Enabled =true; } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) //由Timer1控制影像相減 { count ; Graphics::TBitmap* BMP1 =new Graphics::TBitmap(); BMP1->Assign(Image1->Picture->Bitmap); BMP1->PixelFormat=pf24bit; int i,j,d; byte *ptr; int frame_now[256][337]; int frame_next[256][337]; for(j=0;j { ptr = (Byte *)BMP1->ScanLine[j]; for(i=0;i { if ((count%2)==0) frame_now[j][i] = (77*ptr[i*3 2] 151*ptr[i*3 1] 28*ptr[i*3])/256; else frame_next[j][i] = (77*ptr[i*3 2] 151*ptr[i*3 1] 28*ptr[i*3])/256; } } for(j=0;j { ptr = (Byte *)BMP1->ScanLine[j]; for(i=0;i { d = abs(frame_now[j][i]-frame_next[j][i]); if(d<30) { ptr[i*3]=0; ptr[i*3 1]=0; ptr[i*3 2]=0; } else { ptr[i*3]=255; ptr[i*3 1]=255; ptr[i*3 2]=255; } } } Image2->Picture->Bitmap->Assign(BMP1); delete BMP1; Form1->DoubleBuffered=true ; //讓畫面不再閃爍 } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer2Timer(TObject *Sender) //由Timer2控制連續擷取影像 { Graphics::TBitmap *Bmp=new Graphics::TBitmap(); Bmp->PixelFormat=pf24bit; capEditCopy(cap1); if(Clipboard()->HasFormat(CF_DIB)) { Bmp->Assign(Clipboard()); Image1->Picture->Assign(Bmp); delete Bmp; } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Form1->DoubleBuffered=true ; //讓畫面不再閃爍 } //--------------------------------------------------------------------------- [/code]
------
多多指教 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
kkk1225
一般會員 發表:7 回覆:14 積分:4 註冊:2010-03-02 發送簡訊給我 |
|
kkk1225
一般會員 發表:7 回覆:14 積分:4 註冊:2010-03-02 發送簡訊給我 |
|
wgbird
一般會員 發表:0 回覆:4 積分:0 註冊:2010-07-01 發送簡訊給我 |
|
kkk1225
一般會員 發表:7 回覆:14 積分:4 註冊:2010-03-02 發送簡訊給我 |
|
wgbird
一般會員 發表:0 回覆:4 積分:0 註冊:2010-07-01 發送簡訊給我 |
|
kkk1225
一般會員 發表:7 回覆:14 積分:4 註冊:2010-03-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |