foreseer
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表: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-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值
所以不曉得該怎麼寫才正確
麻煩各位高手提點
謝謝
|