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

real-time frame subtraction

答題得分者是:arisaka_matsuri
yplin
一般會員


發表:9
回覆:16
積分:5
註冊:2004-08-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-11 09:10:08 IP:140.112.xxx.xxx 未訂閱
大家好: 我想達到即時影像相減之目的,連續5張frame對reference frame做做相減。但capSetCallbackOnFrame中撰寫影像相減的程式,可是好像都是讀到相同的frame,無法取得連續的frame。 不知各位高手建議該怎麼下手。
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-11 09:14:18 IP:140.113.xxx.xxx 未訂閱
dear yplin: 可以將程式PO出來嗎?
yplin
一般會員


發表:9
回覆:16
積分:5
註冊:2004-08-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-11 10:01:23 IP:140.112.xxx.xxx 未訂閱
我只是利用2 frame相減,可是感覺在同一個callback中所取得的frame是相同的。    
 
LRESULT CALLBACK FrameCallBack( HWND hCapWnd, Longint lpvhdr )
{
   LPVIDEOHDR VideoStr;
   VideoStr=LPVIDEOHDR(lpvhdr);
   Graphics::TBitmap *bmp=new Graphics::TBitmap();
   byte *ptr,*ptr1,*ptr2,*ptr3,*ptr4;       bmp->Width=WIDTH;
   bmp->Height=HEIGHT;
   bmp->PixelFormat=pf24bit;       int k=0;
   for (int h=0;hScanLine[HEIGHT-h-1];       
      for (int w=0;w < 3*WIDTH; w=w 3,k=k 3)
      {
         ptr[w]=  (VideoStr->lpData)[k];
         ptr[w 1]=(VideoStr->lpData)[k 1];
         ptr[w 2]=(VideoStr->lpData)[k 2];
      }
   }
   Form1->Image1->Picture->Assign(bmp);
   delete (bmp);       //-----------------------------------------------------
   Graphics::TBitmap *bmp1=new Graphics::TBitmap();
   bmp1->Width=WIDTH;
   bmp1->Height=HEIGHT;
   bmp1->PixelFormat=pf24bit;       int k1=0;
   for (int h=0;hScanLine[HEIGHT-h-1];       // BGR
      for (int w=0;w < 3*WIDTH; w=w 3,k1=k1 3)
      {
         ptr1[w]=  (VideoStr->lpData)[k1];
         ptr1[w 1]=(VideoStr->lpData)[k1 1];
         ptr1[w 2]=(VideoStr->lpData)[k1 2];
      }
   }
   Form1->Image2->Picture->Assign(bmp1);
   delete (bmp1);
   //-----------------------------------------------------
   Graphics::TBitmap *bmp2=new Graphics::TBitmap();
   bmp2->Width=WIDTH;
   bmp2->Height=HEIGHT;
   bmp2->PixelFormat=pf8bit;
    for (int h=0;hImage1->Picture->Bitmap->ScanLine[h];
      ptr3=(Byte *)Form1->Image2->Picture->Bitmap->ScanLine[h];
      ptr4=(byte *)bmp2->ScanLine[h];
      for (int w=0;wImage3->Picture->Assign(bmp2);
   delete (bmp2);
   
   return(1);
}
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-11 12:24:17 IP:140.113.xxx.xxx 未訂閱
dear yplin: 因為兩次取得影像資料都寫在CALLBACK裡,bmp與bmp1取得的資料都是同一份,當然是相同的。我的作法是另外準備一個TBitmap物件來handle前一張影像,在每次CALLBACK中(抓到的影像看成「現在」的影像)再做相減,就不會有這個問題了。 大概的安排可以寫成
//** Unit1.h **
...
Graphics::TBitmap *pRefBitmap;
...    //** Unit1.cpp **
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner)
{
  ...
  pRefBitmap = new Graphics::TBitmap();
  // 初始化你的參考影像
  ...
}
.
.
.
LRESULT CALLBACK FrameCallBack( HWND hCapWnd, Longint lpvhdr )
{
  // 取得目前的影像
  ...
  // 將目前影像與參考影像相減
  ...
  // 後處理(顯示或其他處理)
  ...
}
如此一來,每次新的影像擷取後,CALLBACK函式會被執行,就是以該影像與你所存的參考影像作相減。建議先把流程圖畫出來,會更清楚
yplin
一般會員


發表:9
回覆:16
積分:5
註冊:2004-08-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-11 15:29:34 IP:140.112.xxx.xxx 未訂閱
謝謝你的回覆。 不好意思,我沒說清楚我的目的,我要的reference image是從sequence frame中不斷的被更新,並不是固定不變的,所以是不是沒辦法在capSetCallbackOnFrame中達到?還是要用別的fuction呢? 謝謝~
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-11 16:02:10 IP:140.113.xxx.xxx 未訂閱
dear yplin:
LRESULT CALLBACK FrameCallBack( HWND hCapWnd, Longint lpvhdr )
{
  // 取得目前的影像
  ...
  // 將目前影像與參考影像相減
  ...
  // 後處理(顯示或其他處理)
  ...
  // 將目前的影像更新至 pRefBitmap
  ...
}
如此一來,做完相減動作後,你的參考影像也會被更新到「目前」的影像。等到下一次畫面被擷取時(CALLBACK函式被呼叫),就會產生新的影像減去舊的影像的效果~
yplin
一般會員


發表:9
回覆:16
積分:5
註冊:2004-08-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-11 16:43:29 IP:140.112.xxx.xxx 未訂閱
謝謝你的回覆~ 原來如此。 謝謝~
系統時間:2024-05-20 23:39:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!