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

ccd每秒可以擷取的frame數卡在10~15個

答題得分者是:arisaka_matsuri
n63e
一般會員


發表:3
回覆:5
積分:1
註冊:2009-01-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-01-13 17:52:02 IP:219.87.xxx.xxx 訂閱
我是用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-01-14 09:09:05 IP:61.61.xxx.xxx 訂閱
你好,
看樣子這個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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-01-14 11:30:13 IP:219.87.xxx.xxx 訂閱
經你這麼一分析
我發現我的照片維度是960x600
我先看看能不能藉由改善fwrite()的效能
加快fps
可能先一口氣多設定幾個FILE *fp
累積多個檔案再一次寫入
先試看看,看能不能增進效能
我再來回報

經過跟上頭的討論,不用做到30fps了
10-15fps是它們可以免強接受的範圍
也感謝arisaka_matsuri大大的幫忙
雖然我有想到解決的方法:就是使用非同步的I/O
不過礙於時間上的問題,就不去實做了
------
大家好,我是個初入門的BCB學習者
請多多指教喔~
編輯記錄
n63e 重新編輯於 2009-01-15 09:55:51, 註解 無‧
系統時間:2024-11-25 14:44:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!