全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1213
推到 Plurk!
推到 Facebook!

怎麼擷取frame的RGB值

尚未結案
foreseer
一般會員


發表:14
回覆:16
積分:6
註冊:2004-01-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-13 15:54:44 IP:211.23.xxx.xxx 未訂閱
請教各位先進 小弟參考過rgb轉灰階的程式碼之後,想說應該可以利用它來作電影單張frame的rgb值擷取 所以我將原本參考的程式碼小小改寫一下 我是要將form1上面透過image1撥出影片的同時想將frame上的rgb值抽取出來 程式如下    
 Graphics::TBitmap *pic = new Graphics::TBitmap  
  pic->PixelFormat=pf24bit;
  pic->Height=VideoHeight;
  pic->Width=VideoWidth;
//新增程式碼:用於擷取frame的bgr值//////////////////////
  Byte *ptr=NULL;
  int r,g,b;
  int gray;
  int i,j;
  //int threshold;      pic->Assign(Image1->Picture);
  for(j=0;jHeight;j++)
  {
    ptr = (Byte *)pic->ScanLine[j];
    for(i=0;iWidth;i++)
    {
      b=ptr[i*3];
      g=ptr[i*3+1];
      r=ptr[i*3+2];
    }
  }  
但是RUN的時候會出現問題==> 不知道觀念哪裡有錯,麻煩各位先進不吝指正 感謝您 發表人 -
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-13 16:13:53 IP:140.135.xxx.xxx 未訂閱
foreseer您好: 請勿一文多PO.. PO程式碼的方式請參考版規做適當的修改 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=43591 謝謝您的配合< > 順心< >
foreseer
一般會員


發表:14
回覆:16
積分:6
註冊:2004-01-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-13 16:18:17 IP:211.23.xxx.xxx 未訂閱
taishyang版主 很抱歉 我是新手,剛發現的時候想刪除其中一篇文章已經來不及了 請見諒
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-13 16:25:41 IP:140.135.xxx.xxx 未訂閱
foreseer您好: 首頁有跑馬燈,可以參考看看本站守則< > 程式碼看起來沒有問題,會出現這錯誤應該不是程式碼導致的 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 - taishyang 於 2004/02/13 16:26:43
foreseer
一般會員


發表:14
回覆:16
積分:6
註冊:2004-01-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-13 16:51:27 IP:211.23.xxx.xxx 未訂閱
引言: foreseer您好: 首頁有跑馬燈,可以參考看看本站守則< > 程式碼看起來沒有問題,會出現這錯誤應該不是程式碼導致的 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 - taishyang 於 2004/02/13 16:26:43
謝謝版主回答 剛我又試了一下,可以執行了但是出現的錯誤如下: 請教一下這是怎樣的錯誤呢?< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=14036498&CC=313922">
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-13 17:45:44 IP:140.135.xxx.xxx 未訂閱
foreseer您好: 您的程式碼還是原來的嗎?讀的圖檔是BMP嗎? 貼程式看問題在哪邊會比較快說 發表人 -
foreseer
一般會員


發表:14
回覆:16
積分:6
註冊:2004-01-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-15 12:05:13 IP:61.70.xxx.xxx 未訂閱
引言: foreseer您好: 您的程式碼還是原來的嗎?讀的圖檔是BMP嗎? 貼程式看問題在哪邊會比較快說 發表人 - >< face="Verdana, Arial, Helvetica"> 謝謝taishyang板主的回應 我把程式PO出來,
 int __fastcall TForm1::ShotChangeDetection(int *Bitstream_Framenumber)
{
  int Bitstream_Framenum;
  int Sequence_Framenum;
  int Return_Value;      long Y256[256]={0},P_frame_Y[30][8],N_frame_Y[30][8];
  int CutShotThreshold=StrToInt(Edit3->Text),GradualShotThreshold=StrToInt(Edit3->Text),CV=StrToInt(Edit2->Text),Diff=0,PreDiff=0,
      Ly=0,Hx=0,Hy=0,SHOT_ID=1,FRAME_START=0,FRAME_END=0,KEY_FRAME=1;
  bool GradualShot=false,Pre_L=true,CutShot=false,FindShot=false;
  unsigned char *Bitmap_Y;      VideoWidth=horizontal_size;
  VideoHeight=vertical_size;
  StatusBar1->Panels->Items[1]->Text=VideoWidth;
  StatusBar1->Panels->Items[3]->Text=VideoHeight;      if(ViewWindow1->Checked)
    RGB_info=true;
  else
    RGB_info=false;
  MV_info=false;
  DC_AC_info=false;      Graphics::TBitmap *pic = new Graphics::TBitmap  
  pic->PixelFormat=pf24bit; 
  pic->Height=VideoHeight;
  pic->Width=VideoWidth;
//新增程式碼:用於擷取frame的bgr值//////////////////////
  Byte *ptr=NULL;
  int r,g,b;
  int gray;
  int i,j;
  //int threshold;      pic->Assign(Image1->Picture);
  for(j=0;jHeight;j  )
  {
    ptr = (Byte *)pic->ScanLine[j];
    for(i=0;iWidth;i  )
    {
      b=ptr[i*3];
      g=ptr[i*3 1];
      r=ptr[i*3 2];
    }
  }
//////以上是新增的程式碼部分///////      Image2_Setup();
  Table1_Setup();
  Image1->Canvas->Brush->Color = clBtnFace;
  Image1->Canvas->FillRect(Rect(0,0,352,240));
  Image8->Canvas->Brush->Color = clBtnFace;
  Image8->Canvas->FillRect(Rect(0,0,352,240));      Bitstream_Framenum = *Bitstream_Framenumber;
  Sequence_Framenum=0;      Initialize_Sequence();      if(MV_info)
  {
    Forward_MV_x=(int *)malloc(mb_width*mb_height*sizeof(int));
    Forward_MV_y=(int *)malloc(mb_width*mb_height*sizeof(int));
    Backward_MV_x=(int *)malloc(mb_width*mb_height*sizeof(int));
    Backward_MV_y=(int *)malloc(mb_width*mb_height*sizeof(int));
    Backward_Ref_Block=(bool *)malloc(mb_width*mb_height*size(bool));
  }      /* decode picture whose header has already been parsed in
     Decode_Bitstream() */      Decode_Picture(Bitstream_Framenum, Sequence_Framenum);      if(RGB_info)
    ShowFrame(pic,Sequence_Framenum);
          /* update picture numbers */
  if (!Second_Field)
  {
    Bitstream_Framenum  ;
    Sequence_Framenum  ;
  }      /* loop through the rest of the pictures in the sequence */
  while ((Return_Value=Headers())!=0)
  {        Application->ProcessMessages();        Decode_Picture(Bitstream_Framenum, Sequence_Framenum);        if(RGB_info)
      ShowFrame(pic,Sequence_Framenum);        for(int x=0;x<256;x  )
      Y256[x]=0;        if(picture_coding_type!=B_TYPE)
      Bitmap_Y=forward_reference_frame[0];
    else
      Bitmap_Y=auxframe[0];        for(int x=0;x<VideoHeight*VideoWidth;x  )
      Y256[(short)Bitmap_Y[x]]  ;        for(int x=0;x<8;x  )
      N_frame_Y[Sequence_Framenum%CV][x]=0;
    for(int x=0;x<256;x  )
      N_frame_Y[Sequence_Framenum%CV][x/32] =Y256[x];        if(Sequence_Framenum>CV)
    {
      Diff=0;
      for(int x=0;x<8;x  )
        Diff =(N_frame_Y[Sequence_Framenum%CV][x]Checked)
        if(Sequence_Framenum<400)
          Image2_Line(Sequence_Framenum,100,Sequence_Framenum,100Diff,clWhite,false);
        else
        {
          if(Sequence_Framenum%==0)
            Image2_Line(399,100,399,0,clGreen,true);
          else
            Image2_Line(399,100,399,0,clBlack,true);
            Image2_Line(399,100,399,100-Diff,clWhite,false);
        }          if(!CutShot)
        if(!GradualShot&&Diff>=CutShotThreshold&&   
(0.3*DiffPreDiff>0||PreDiff<3))
        {
          Hx=Sequence_Framenum;
          Hy=Diff;
          CutShot=true;
          FRAME_END=Sequence_Framenum;
          if(RGB_info&&ViewWindow3->Checked)
            Image3->Canvas->StretchDraw(Rect(0,0,100,Image3->Height),pic);
        }
        //a Gradual transition shot
        else
        {
          //L-H ...
          if(Pre_L&&Diff-Ly>=GradualShotThreshold)
          {
            Hx=Sequence_Framenum;
            Hy=Diff;
            GradualShot=true;
            Pre_L=false;
            FRAME_END=Sequence_Framenum;
          }
          //L-L
          else if(Pre_L&&Ly-Diff>0)
          {
            KEY_FRAME=Sequence_Framenum;
            Ly=Diff;
            if(RGB_info&&ViewWindow3->Checked)
              Image3->Canvas->StretchDraw(Rect(0,0,100,Image3->Height),pic);
          }
          //H-H
          else if(!Pre_L&&Diff-Hy>0)
          {
            Hx=Sequence_Framenum;
            Hy=Diff;
            FRAME_END=Sequence_Framenum;
          }
          //H-L
          else if(GradualShot&&!Pre_L&&Hy-Diff>=GradualShotThreshold)
          {
            KEY_FRAME=Sequence_Framenum;
            if(Hy>=GradualShotThreshold)
              FindShot=true;
            Ly=Diff;
            Pre_L=true;
            if(RGB_info&&ViewWindow3->Checked)
              Image3->Canvas->StretchDraw(Rect(0,0,100,Image3->Height),pic);
          }
        }
      else
        if(Sequence_Framenum-Hx0.5)
          {
            Hx=Sequence_Framenum;
            Hy=Diff;
            if(Diff>=GradualShotThreshold)
            {
              Pre_L=false;
              GradualShot=true;
            }
            else
            {
              Pre_L=true;
              GradualShot=false;
            }
            CutShot=false;
            FRAME_END=Sequence_Framenum;
          }              //a flashlight ...
          if(Sequence_Framenum-Hx<4)
          {
            if(Diff<=Hy/3.)
            {
              CutShot=false;
              Hy=Diff;
            }
          }
        }
        else
          FindShot=true;          if(FindShot)
      {
        //Draw Red Line ...
        if(ViewWindow2->Checked)
          if(Sequence_Framenum<400)
            Image2_Line(Hx,100,Hx,0,clRed,false);
          else
            Image2_Line(399-Sequence_Framenum Hx,100,399-Sequence_Framenum Hx,0,clRed,false);            Table1->AppendRecord(ARRAYOFCONST((SHOT_ID,FRAME_START,FRAME_END-1,(FRAME_START FRAME_END)/2,CutShot?"":"T",Hy)));            SHOT_ID  ;
        if(CutShot)
        {
          KEY_FRAME=FRAME_END;
          Hx=Sequence_Framenum;
          Hy=Diff;
          Pre_L=true;
        }
        FRAME_START=FRAME_END;
        CutShot=false;
        GradualShot=false;
        FindShot=false;
      }
    }
    PreDiff=Diff;
    Diff=0;
    for(int x=0;x<8;x  )
      P_frame_Y[Sequence_Framenum%CV][x]=N_frame_Y[Sequence_Framenum%CV][x];        if (!Second_Field)
    {
      Bitstream_Framenum  ;
      Sequence_Framenum  ;
    }        if(MV_info)
      ShowMV(pic,Sequence_Framenum);
 
    StatusBar1->Panels->Items[5]->Text=Sequence_Framenum;
    StatusBar1->Refresh();
  }      if(!CutShot&&Hy>GradualShotThreshold)
  {
    //Draw The Final Red Line ...
    if(ViewWindow2->Checked)
      Image2->Canvas->Pen->Color=clRed;
      if(Sequence_Framenum<400)
      {
        Image2->Canvas->MoveTo(Hx,100);
        Image2->Canvas->LineTo(Hx,0);
      }
      else
      {
        Image2->Canvas->MoveTo(400-Sequence_Framenum Hx,100);
        Image2->Canvas->LineTo(400-Sequence_Framenum Hx,0);
      }
  }
  Table1->AppendRecord(ARRAYOFCONST((SHOT_ID,FRAME_START,Sequence_Framenum 1,KEY_FRAME,CutShot?"":"T",Hy)));      /* put last frame */
  if (Sequence_Framenum!=0)
  {
    Output_Last_Frame_of_Sequence(Bitstream_Framenum);        if(RGB_info)
      ShowFrame(pic,Sequence_Framenum);        StatusBar1->Panels->Items[5]->Text=Sequence_Framenum;
  }      Deinitialize_Sequence();    #ifdef VERIFY
    Clear_Verify_Headers();
#endif /* VERIFY */      *Bitstream_Framenumber = Bitstream_Framenum;      delete pic;
  if(MV_info)
  {
    free(Forward_MV_x);
    free(Forward_MV_y);
    free(Backward_MV_x);
    free(Backward_MV_y);
    free(Backward_Ref_Block);
  }      return(Return_Value);
}
//---------------------------------------------------------------------------
因為我是將一段影片解碼之後再找出每張frame的RGB值 所以不曉得該怎麼寫才正確 麻煩各位高手提點 謝謝
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-16 02:45:59 IP:61.231.xxx.xxx 未訂閱
foreseer您好: 
引言: 因為我是將一段影片解碼之後再找出每張frame的RGB值 所以不曉得該怎麼寫才正確
假設您已經將frame呈現至TImage上... 那您的第一個程式碼應就可以取得該RGB值了 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31473 上面連結可以參考看看 或者您可以將您的專案上傳至 http://delphi.ktop.com.tw/forum.asp?FORUM_ID=97 好讓有經驗的前輩可以幫您看看 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
foreseer
一般會員


發表:14
回覆:16
積分:6
註冊:2004-01-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-02-17 17:55:27 IP:211.23.xxx.xxx 未訂閱
引言: foreseer您好:
引言: 因為我是將一段影片解碼之後再找出每張frame的RGB值 所以不曉得該怎麼寫才正確
假設您已經將frame呈現至TImage上... 那您的第一個程式碼應就可以取得該RGB值了 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31473 上面連結可以參考看看 或者您可以將您的專案上傳至 http://delphi.ktop.com.tw/forum.asp?FORUM_ID=97 好讓有經驗的前輩可以幫您看看 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ < face="Verdana, Arial, Helvetica"> 謝謝版主 我再試試看~~~如果還是不會@@希望各位先進再次指導一下 謝謝
foreseer
一般會員


發表:14
回覆:16
積分:6
註冊:2004-01-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-02-19 14:45:25 IP:140.109.xxx.xxx 未訂閱
taishyang版大 謝謝您之前的指導,我的問題解決了 原因出在  pic->Assign(Image1->Picture);這行程式 執行到之前 主程式已經呼叫過一個 一次  ShowFrame(pic,Sequence_Framenum);這個副程式了 而此副程式裡面有個功能是會將frame貼到Image1 此時會有兩個貼圖的步驟同時對Image1而造成顯示不出畫面的錯誤(只有綠色畫面)~~~~~~~~ 感謝版大和各位先進的幫忙 謝謝
系統時間:2024-05-10 11:29:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!