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

有關連續影像之背景建立(Scan line out of range)

答題得分者是:taishyang
mynameisoa
一般會員


發表:4
回覆:8
積分:2
註冊:2008-10-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-22 22:53:01 IP:163.13.xxx.xxx 訂閱
我使用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;yHeight;y ){
ptr = (Byte*)TempBitmap->ScanLine[y];
for(int x=0;xWidth;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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-23 11:33:24 IP:118.169.xxx.xxx 訂閱
這原因都是因為ScanLine[y],其中的y超出掃描範圍導致
至於為什麼超出範圍,下斷點慢慢trace應該查的出來
mynameisoa
一般會員


發表:4
回覆:8
積分:2
註冊:2008-10-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-24 15:04:36 IP:163.13.xxx.xxx 訂閱
關於Scanline out of range的問題...我解決了!

由於我的方法需要Timer去run9次,才能將buffer存滿...

問題就出在這!

在9次前,後面的image裡面是空的,所以去掃scanline時會說他out of range...

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