怎麼擷取frame的RGB值 |
尚未結案
|
foreseer
一般會員 發表:14 回覆:16 積分:6 註冊:2004-01-28 發送簡訊給我 |
請教各位先進
小弟參考過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 發送簡訊給我 |
foreseer您好:
請勿一文多PO..
PO程式碼的方式請參考版規做適當的修改
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=43591
謝謝您的配合< > 順心< >
|
foreseer
一般會員 發表:14 回覆:16 積分:6 註冊:2004-01-28 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
foreseer
一般會員 發表:14 回覆:16 積分:6 註冊:2004-01-28 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
foreseer
一般會員 發表:14 回覆:16 積分:6 註冊:2004-01-28 發送簡訊給我 |
引言: 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-Hx因為我是將一段影片解碼之後再找出每張frame的RGB值 所以不曉得該怎麼寫才正確 麻煩各位高手提點 謝謝 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |