圖檔連續播放與存檔的問題 |
答題得分者是:FancyWing
|
silentknox
一般會員 發表:2 回覆:1 積分:0 註冊:2005-01-12 發送簡訊給我 |
各位前輩您好:
小弟最近在寫一個影像處理的模擬程式,為了要驗證影像處理的功能是否正確 原本影像處裡的程式如下: 攝影機(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 發送簡訊給我 |
找到問題了
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時制,只保留數字部分的差異 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |