ccd每秒可以擷取的frame數卡在10~15個 |
答題得分者是:arisaka_matsuri
|
n63e
一般會員 發表:3 回覆:5 積分:1 註冊:2009-01-05 發送簡訊給我 |
我是用BCB
現在要從內部網路上擷取一台ccd的照片(那台ccd唯一外接的線,除了電源線之外,就只有網路線了) 我是把該網路線直接接在我的電腦,並且利用BCB讀取照片 目前卡在每秒只能擷取大約10-15個frame,不論我的timer怎麼設定 最快也只能到這樣,請問我的程式的效能是哪裡不好呢 我的目標是每秒30個frame 附上我的程式碼 [code cpp] void __fastcall TForm1::Timer1Timer(TObject *Sender) { //--------------變數-------------------- HINTERNET hInternet ; HINTERNET hOpenUrl; AnsiString HTTPServer, sBuffer ; char * lpBuffer ; DWORD lpdwNumberOfBytesRead, dwSize ; char lpHTTPServer[200]; double static id = 1231550025500; AnsiString now = Now().FormatString("yyyy-mm-dd hh_nn_ss"); int static fileCount =0; String sFile = "c:\\temp\\" now "_" IntToStr(fileCount) ".jpg";//^^^資料夾要先自己建立好^^^^^^^ FILE *fp; //---------------變數-------------------- //-----------------程式主體-------------------- //ShowMessage("中原標準時間:" (AnsiString)Now().FormatString("yyyy-mm-dd hh_nn_ss")); dwSize = 2048*16;//這個ccd拍出來的照片大概需要這麼大才裝得下 lpBuffer = (char*)malloc(dwSize); fp= fopen (sFile.c_str(), "wb "); if (fp==NULL ) { Memo1->Lines->Add("fOpen() 冏了一下"); return; } HTTPServer = "http://192.168.0.150/image?res=half&x0=0%&y0=0%&x1=100%&y1=100%&quality=15&doublescan=0&ssn=1231548887343&id=" FloatToStr(id); wsprintf((LPSTR) lpHTTPServer, "%s", HTTPServer); //wsprintf(緩衝區,格式,要格式化的值); //這個function可以將內容格式化輸出到第一個參數所提供的緩衝區 hInternet = InternetOpen("Application",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0) ; if(!hInternet) { Memo1->Lines->Add("InternetOpen() 看到鬼"); return; } hOpenUrl = InternetOpenUrl(hInternet,lpHTTPServer,NULL,0, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE,0) ; if (!hOpenUrl) { Memo1->Lines->Add("InternetOpenUrl() 大失敗"); return; } if(!InternetReadFile(hOpenUrl,(LPVOID)lpBuffer,dwSize-1,&lpdwNumberOfBytesRead)) { Memo1->Lines->Add("InternetReadFile()殘念..."); return; } //CppWebBrowser1->Navigate(WideString(HTTPServer)); //ShowMessage("lpdwNumberOfBytesRead value:" IntToStr(lpdwNumberOfBytesRead)); id ;//每次必須以不同的參數,才可以一直存取到不同的圖片 fileCount ; if(lpdwNumberOfBytesRead==0) { Memo1->Lines->Add("InternetReadFile()讀到大小為零的檔案"); return; } else fwrite(lpBuffer,sizeof(char),lpdwNumberOfBytesRead,fp); //-----------------程式主體-------------------- //-----------------------釋放資源---------------------- free(lpBuffer); fclose(fp); InternetCloseHandle(hOpenUrl) ; InternetCloseHandle(hInternet) ; //-----------------------釋放資源---------------------- } //---------------------------------------------------------------------------[/code]
------
大家好,我是個初入門的BCB學習者 請多多指教喔~ 編輯記錄
n63e 重新編輯於 2009-01-13 17:52:48, 註解 無‧
|
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
你好,
看樣子這個CCD應該是IP Camera 如果是這樣的話,實際的畫面擷取速率會受 1. 影像大小與壓縮品質 2. 網路傳輸 3. 環境亮度(會影響曝光時間) 三個主要因素的影響 另外就是程式的第59行,把影像存入硬碟 這個動作也有可能造成效率下降 以個人的經驗,曾用過某 IP Camera 在640x480的尺寸、畫質設定為「高」(總共五級,這是最好) 網路線(100Mbps)直接接電腦的情況下,最多約 22~23 fps 在320x240尺寸、畫質設定為中等 只用一隻camera (接法同上),可以到 27~29 fps 同時接四隻camera (用一個switch)的情況下,擷取速率(四隻的總和)最多也是 22~24 fps 而無線網路的IP Camera(802.11b) 在320x240尺寸時,最多不超過10 fps 802.11g的IP Camera (Panasonic) 在320x240尺寸時,最多可到約15~20 fps 提供作參考
編輯記錄
arisaka_matsuri 重新編輯於 2009-01-14 09:10:33, 註解 無‧
arisaka_matsuri 重新編輯於 2009-01-14 09:12:02, 註解 無‧ arisaka_matsuri 重新編輯於 2009-01-14 09:18:35, 註解 補充無線IP Camera‧ |
n63e
一般會員 發表:3 回覆:5 積分:1 註冊:2009-01-05 發送簡訊給我 |
經你這麼一分析
我發現我的照片維度是960x600 我先看看能不能藉由改善fwrite()的效能 加快fps 可能先一口氣多設定幾個FILE *fp 累積多個檔案再一次寫入 先試看看,看能不能增進效能 我再來回報 經過跟上頭的討論,不用做到30fps了 10-15fps是它們可以免強接受的範圍 也感謝arisaka_matsuri大大的幫忙 雖然我有想到解決的方法:就是使用非同步的I/O 不過礙於時間上的問題,就不去實做了
------
大家好,我是個初入門的BCB學習者 請多多指教喔~
編輯記錄
n63e 重新編輯於 2009-01-15 09:55:51, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |