有關連續影像之背景建立(Scan line out of range) |
答題得分者是:taishyang
|
mynameisoa
一般會員 發表:4 回覆:8 積分:2 註冊:2008-10-07 發送簡訊給我 |
我使用taishyang大 提供的ezcam元件將連續9張畫面hold住...(這步驟測試過OK)
針對9張畫面的同一pixel點去做中值, 希望藉此能產生一張由中值點組成的背景圖(不動的前景也視為背景) 但程式似乎有誤... 想請板上的諸位高手協助幫忙 感謝! 以下為程式碼(節錄) [code cpp] Graphics::TBitmap *BkgTemp1 = new Graphics::TBitmap(); Graphics::TBitmap *BkgTemp2 = new Graphics::TBitmap(); Graphics::TBitmap *BkgTemp3 = new Graphics::TBitmap(); Graphics::TBitmap *BkgTemp4 = new Graphics::TBitmap(); Graphics::TBitmap *BkgTemp5 = new Graphics::TBitmap(); Graphics::TBitmap *BkgTemp6 = new Graphics::TBitmap(); Graphics::TBitmap *BkgTemp7 = new Graphics::TBitmap(); Graphics::TBitmap *BkgTemp8 = new Graphics::TBitmap(); Graphics::TBitmap *BkgTemp9 = new Graphics::TBitmap(); //----------------------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { Graphics::TBitmap *TempBitmap= new Graphics::TBitmap(); TempBitmap->PixelFormat=pf24bit; if(Button9->OnClick){ //run process int x, y, i, j, gray; Byte *ptr; EzCapCamera1->CapBitmapFrame(TempBitmap); //RGB2Gray for(int y=0;y ptr = (Byte*)TempBitmap->ScanLine[y]; for(int x=0;x bmp_b=ptr[x*3]; bmp_g=ptr[x*3 1]; bmp_r=ptr[x*3 2]; gray=0.299*bmp_r 0.587*bmp_g 0.114*bmp_b; ptr[x*3]=(Byte)gray; ptr[x*3 1]=(Byte)gray; ptr[x*3 2]=(Byte)gray; } } //image out Image1->Picture->Bitmap->Assign(TempBitmap); /**************************************************************/ /* Background building */ /**************************************************************/ //set the PixelFormat BkgTemp1->PixelFormat=pf24bit; BkgTemp2->PixelFormat=pf24bit; BkgTemp3->PixelFormat=pf24bit; BkgTemp4->PixelFormat=pf24bit; BkgTemp5->PixelFormat=pf24bit; BkgTemp6->PixelFormat=pf24bit; BkgTemp7->PixelFormat=pf24bit; BkgTemp8->PixelFormat=pf24bit; BkgTemp9->PixelFormat=pf24bit; //gen. the temp bkg. BkgTemp1->Assign(TempBitmap); //Temp Background Bitmap display Image3->Picture->Bitmap->Assign(BkgTemp1); Image4->Picture->Bitmap->Assign(BkgTemp2); Image5->Picture->Bitmap->Assign(BkgTemp3); Image6->Picture->Bitmap->Assign(BkgTemp4); Image7->Picture->Bitmap->Assign(BkgTemp5); Image8->Picture->Bitmap->Assign(BkgTemp6); Image9->Picture->Bitmap->Assign(BkgTemp7); Image10->Picture->Bitmap->Assign(BkgTemp8); Image11->Picture->Bitmap->Assign(BkgTemp9); //frame buffer BkgTemp9->Assign(BkgTemp8); BkgTemp8->Assign(BkgTemp7); BkgTemp7->Assign(BkgTemp6); BkgTemp6->Assign(BkgTemp5); BkgTemp5->Assign(BkgTemp4); BkgTemp4->Assign(BkgTemp3); BkgTemp3->Assign(BkgTemp2); BkgTemp2->Assign(BkgTemp1); int M[9]; Byte *bkg, *bkg1, *bkg2, *bkg3, *bkg4, *bkg5, *bkg6, *bkg7, *bkg8, *bkg9; //產生一臨時圖像做Background building Graphics::TBitmap *Background= new Graphics::TBitmap(); Background->PixelFormat=pf24bit; for(int y=0;y<(TempBitmap->Height);y ){ bkg = (Byte*)Background->ScanLine[y]; bkg1 = (Byte*)BkgTemp1->ScanLine[y]; bkg2 = (Byte*)BkgTemp2->ScanLine[y]; bkg3 = (Byte*)BkgTemp3->ScanLine[y]; bkg4 = (Byte*)BkgTemp4->ScanLine[y]; bkg5 = (Byte*)BkgTemp5->ScanLine[y]; bkg6 = (Byte*)BkgTemp6->ScanLine[y]; bkg7 = (Byte*)BkgTemp7->ScanLine[y]; bkg8 = (Byte*)BkgTemp8->ScanLine[y]; bkg9 = (Byte*)BkgTemp9->ScanLine[y]; for(int x=0;x<(TempBitmap->Width);x ){ M[0]=(int)bkg1[3*x]; M[1]=(int)bkg2[3*x]; M[2]=(int)bkg3[3*x]; M[3]=(int)bkg4[3*x]; M[4]=(int)bkg5[3*x]; M[5]=(int)bkg6[3*x]; M[6]=(int)bkg7[3*x]; M[7]=(int)bkg8[3*x]; M[8]=(int)bkg9[3*x]; for(int i=0 ; i<9 ; i ){ for(int j=i 1 ; j<9 ; j ){ if(M[i] < M[j]){ tmp = M[i]; M[i] = M[j]; M[j] = tmp; } } } bkg[3*x] = bkg[3*x 1] = bkg[3*x 2] = M[4]; } } //image out Image2->Picture->Bitmap->Assign(Background); delete Background; delete TempBitmap; } else Timer1->Enabled=false; Form1->DoubleBuffered=true; } [/code] 跳出的視窗 編輯記錄
mynameisoa 重新編輯於 2008-12-22 22:54:37, 註解 無‧
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
mynameisoa
一般會員 發表:4 回覆:8 積分:2 註冊:2008-10-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |