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

圖檔連續播放與存檔的問題

答題得分者是:FancyWing
silentknox
一般會員


發表:2
回覆:1
積分:0
註冊:2005-01-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-05-03 22:47:54 IP:61.230.xxx.xxx 訂閱
各位前輩您好:
小弟最近在寫一個影像處理的模擬程式,為了要驗證影像處理的功能是否正確
原本影像處裡的程式如下:
攝影機(YUV)->影像處理->顯示(YUV或RGB)或儲存(YUV或RGB)結果
為了縮短開發上的時間,所以增加了一個模擬的功能
可以先將攝影機的影像儲存成圖片(RGB格式, BMP檔案),再依序讀入程式中
BMP圖檔(RGB)->轉換格式(YUV)->影像處理->顯示(YUV或RGB)或儲存(YUV或RGB)結果
目前發生的問題如下:
1. 使用桌上型電腦跑的時候,程式能夠正常顯示處理的結果,但是啟用儲存功能之後卻都是儲存到同一張影像 ... 好像都是第一張圖
2. 我用筆記型電腦跑的時候,程式能夠正常顯示處理的結果,但是顯示轉換成RGB時整個畫面就停滯了(程式仍在不斷的載入影像),且啟用儲存功能之後也都是儲存到同一張影像
同樣的程式在不同的電腦上發生的問題都不太一樣,希望各位能夠幫我檢閱一下程式碼,提供一些意見
因為保密的一些事項,所以我將程式簡化成只有讀圖檔、顯示和儲存圖檔的功能,進請見諒
程式碼中,主要處理的流程如下:
void __fastcall TMainForm::Timer1Timer(TObject *Sender)
{
if(TestMode == 1)
{ //---載入單張影像
int BufferSize;
unsigned char *tmpOriginal, *tmpNew;
BufferSize = 640*480;
tmpOriginal = bmpImage;
tmpNew = pImage;
for(int i=0 ; i {
*tmpNew = *tmpOriginal ;
*tmpNew = *tmpOriginal ;
*tmpNew = *tmpOriginal ;
}
CallbackBuffer = false;
}
else if(TestMode == 2)
{ //---載入多張影像
int BufferSize;
unsigned char *tmpOriginal, *tmpNew;
AnsiString *IndexHere;
if(bitmap == NULL)
bitmap = new Graphics::TBitmap();
IndexHere = RecordIndex IndexValue;
bitmap->LoadFromFile(*IndexHere);
MainForm->Caption = *IndexHere;
if(bitmap->Height == 480 && bitmap->Width == 640)
{
unsigned char *tmpLine;
unsigned char *rValue, *gValue, *bValue;
if(bmpImage == NULL)
bmpImage = new unsigned char[3 * 480 * 640];
tmpNew = pImage;
for(int j=0 ; j<480 ; j )
{
tmpLine = (unsigned char *)bitmap->ScanLine[j];
for(int i=0 ; i<640 ; i )
{
bValue = tmpLine ;
gValue = tmpLine ;
rValue = tmpLine ;
*tmpNew = ColorTransform->VofRGBtoYUV(*rValue, *gValue, *bValue);
*tmpNew = ColorTransform->UofRGBtoYUV(*rValue, *gValue, *bValue);
*tmpNew = ColorTransform->YofRGBtoYUV(*rValue, *gValue, *bValue);
}
}
}
IndexValue ;
if(IndexValue >= IndexTotal)
IndexValue = 0;
CallbackBuffer = false;
}
if(!CallbackBuffer)
{
Timer1->Enabled = false;
//---影像處理與顯示影像分析的結果
ProjectMainFunction();
//---將顯示的畫面儲存成檔案,以時間命名
if(PreviewForm->SaveImageCheck->Checked)
{
SaveFileName = DateTimeToStr(Now());
SaveFileName = StringReplace(SaveFileName, ":", "", TReplaceFlags()< SaveFileName = StringReplace(SaveFileName, "/", "", TReplaceFlags()< SaveFileName = StringReplace(SaveFileName, " 上午 ", "", TReplaceFlags()< SaveFileName = ExtractFilePath(Application->ExeName) "Recorder\\" SaveFileName "_" clock();
if(MainForm->ViewPreview->Checked && PreviewForm->SaveImageCheck->Checked)
{
PreviewForm->Image1->Refresh();
PreviewForm->Refresh();
PreviewForm->Image1->Picture->SaveToFile(SaveFileName "_Image.bmp");
}
}
//---計算處理影像的速度
AfterTime = GetTickCount();
if(AfterTime != BeforeTime)
MainForm->StatusBar1->Panels->Items[0]->Text = "Frequency: " (AnsiString)(int)(1000 / (AfterTime - BeforeTime) 0.5) " fps";
BeforeTime = AfterTime;
CallbackBuffer = true;
Timer1->Enabled = true;
}
}
//---------------------------------------------------------------------------
在Images的資料夾中有放置一些供各位測試用的圖檔
若載入BMP圖檔則會連續播放單張影像,若載入索引檔案*.idx則會根據檔案內容依序並重複播放
儲存的圖檔會放置在Recorder的資料夾內
------
冬天...屬於我的季節
寒夜無月的星空中 徘徊在森林小徑間
就讓暗處中深冷的風聲 帶走屬於我所有的一切

Silent Love
編輯記錄
silentknox 重新編輯於 2008-05-03 22:56:37, 註解 無‧
FancyWing
一般會員


發表:0
回覆:2
積分:5
註冊:2008-05-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-06-01 12:17:25 IP:140.115.xxx.xxx 未訂閱
找到問題了
static 惹的禍

因為他的存在
結果 使得 nhBmp 跟 ohBmp
鎖定 第一張存的圖
去掉 static 即可
[code cpp]
void __fastcall TPreviewForm::SetPixels(unsigned char *byArray)
{
...
static HBITMAP nhBmp = bitmap->Handle;
static HBITMAP ohBmp = SelectObject(hdc, nhBmp);
...
}

[/code]
後來想想,也許在這使用static有其目的(我沒整個程式看完)
那 請改成
主要是因為 宣告初始化只會做一次,除非該物件不存在
[code cpp]
void __fastcall TPreviewForm::SetPixels(unsigned char *byArray)
{
...
static HBITMAP
nhBmp ,ohBmp ;
nhBmp = bitmap->Handle ;
ohBmp = SelectObject(hdc, nhBmp) ;
...
}

[/code]

另外
存檔檔名
沒有考慮下午 XD

StringReplace 以上(含)
可以下列替代
[code cpp]
TDateTime dtPresent = Now();

Word Year, Month, Day, Hour, Min, Sec, MSec;
DecodeDate(dtPresent, Year, Month, Day);
DecodeTime(dtPresent, Hour, Min, Sec, MSec);

SaveFileName.SetLength(14) ;
sprintf(SaveFileName.c_str(),"dddddd",Year,Month,Day,Hour,Min,Sec);

[/code]

但,和原本的一樣,沒有考慮到12時制,只保留數字部分的差異
編輯記錄
FancyWing 重新編輯於 2008-06-01 13:27:24, 註解 無‧
FancyWing 重新編輯於 2008-06-05 00:33:12, 註解 無‧
系統時間:2024-05-05 19:57:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!