前兩天把攝像頭網路傳輸程式搞定了,傳輸效果也挺不錯,至少沒有出現畫面錯誤。那接下來,我想**一下這個程式的效率:傳輸速度,顯示速度,記憶體占用等等。
先說速度的問題吧。說道速度,那就要拿東西來計時,計算每一幀需要消耗的時間,取個倒數,就是fps了。怎麼計時呢?
首先是clock():
這個函式在中,返回值型別是clock_t,精度:毫秒級,誤差比較大
#include #include int main()
執行了10次,居然沒有一次是精準的,誤差很大。。。這讓我很驚訝,網上的程式碼執行起來能精確的毫秒級,但我不清楚為什麼,誤差這麼大。。。顯然這個肯定不能用在我的程式裡。
然後gettimeofday():
在中,無返回值,精度:微妙級,很精準!!
#include #include int main()
timeval 結構定義為:struct timeval;
經過測試,這個函式準精度很高,精度也很高!就選這個了~~
還有乙個time():
標頭檔案是,返回值是以格林尼治時間(gmt)為標準,從2023年1月1日00:00:00到現在的此時此刻所經過的秒數,精度嘛,就是秒啦
#include #include int main()
明顯這個也不符合我的需求。。。
但是這些方法都能獲取時間和經過的時間,適用於不同的場合吧~
接下來把第二種方法加到我的服務端程式中:
#include #include #include #include #include #include #include #include #include #include #include #include #include #define buffsize 16*1024
long time_calc(struct timeval start, struct timeval end)
int main(int argc, char *argv) ;
int framerate = 0;
char sync[2] = ;
struct timeval t_start, t_end;
long timeuse;
iplimage *frame = 0, header;
if(2 != argc || 0 > (portnumber = atoi(argv[1])))
if(-1 == (skfd = socket(af_inet, sock_stream, 0)))
bzero(&srv_addr, sizeof(struct sockaddr_in));
srv_addr.sin_family = af_inet;
srv_addr.sin_addr.s_addr = htonl(inaddr_any);
srv_addr.sin_port = htons(portnumber);
if(-1 == bind(skfd, (struct sockaddr *)(&srv_addr), sizeof(struct sockaddr)))
//開啟監聽
if(-1 == listen(skfd, 4))
//阻塞接受請求
addr_len = sizeof(struct sockaddr_in);
if(-1 == (cnfd = accept(skfd, (struct sockaddr *)(&clt_addr), &addr_len)))
printf("connect from %s:%u ...!\n", inet_ntoa(clt_addr.sin_addr), ntohs(clt_addr.sin_port));
//初次應答
if(-1 == write(cnfd, hello, strlen(hello)))
//接收index
if(-1 == read(cnfd, (char*)&header, sizeof(iplimage)))
//用收到的index引數建立乙個新的影象
frame = cvcreateimageheader(cvsize(header.width, header.height), header.depth, header.nchannels);
//建立imagedata接收快取
databuff = (char*)malloc(frame->imagesize);
//影象資料直接指向接收快取
frame->imagedata = databuff;
//建立視窗
cvnamedwindow("camera-server", 1);
while(1)
//同步資料流
if(-1 == write(cnfd, sync, 2))
imagedataleft += buffsize;
if(i < buffsize)
} cvshowimage("camera-server", frame);
if(-1 == write(cnfd, "frame done", 10))
gettimeofday(&t_end, null);
timeuse = time_calc(t_start, t_end);
printf("time used : %d || fps : %d\n", timeuse, 1000/timeuse);
if(27 == cvwaitkey(1)) break; }
free(databuff);
cvreleaseimage(&frame);
cvdestroywindow("camera-server");
close(cnfd);
close(skfd);
exit(0);
}
再把cilent.c中的cvwaitkey()和cvshowimage()函式注釋掉,就是全速傳輸啦。
可是fps好像不太穩定,有時候是16~17幀,但喲時候只有一半了,待我仔細找找問題出在哪裡~
******************************====
經過除錯,終於發現了問題所在:
攝像頭會自動調節**時間:光線強時,**時間短,大概50ms;反之,時間會長,長達100ms以上(這是我筆記本自帶的攝像頭)。而資料傳輸處只消耗了3ms,一幀imagedata有921600位元組,可以忽略每次傳輸後的應答,那淨傳輸的速度就是307m/s,是很快的速度了。
收藏 怎樣去愛?
某天 女孩終於鼓起勇氣對男孩說 我們分手吧 男孩問 為什麼?女孩說 倦了,就不需要理由了 乙個晚上 男孩只抽菸不說話 女孩的心也越來越涼 連挽留都不會表達的情人 能給我什麼樣的快樂?過了許久 男孩終忍不住說 怎麼做你才能留下來?女孩慢慢地說 回答乙個問題,如果你能答到我心裡就答案,我就留下來。比如我...
怎樣去設計「icon」
怎樣去設計 icon 第一版 第二版 4.在做第四個 icon 的時候,顏色我選擇了兩種紫色來做,在做這個 icon 的時候,最然我煩惱的是它那個半圓這裡,一開始就用橢圓和圓角矩形來做出乙個 的形狀 在它後面加乙個圓,但做出來很難看,沒有一點設計感。然後我看了一下剛剛做的那個 icon 在聯想一下剛...
怎樣顯示過寬文件?
在開啟文件時,有時會發現因為文件過寬,螢幕上顯示不全,這可怎麼辦,總不能看一行就拖動一次水平滾動條吧!這時我們可以重新調整行的寬度,使其適合文件視窗的大小。如果使用的是普通檢視或大綱檢視,可以單擊 工具 選單中的 選項 命令,再單擊 檢視 選項卡,然後選中 視窗內自動換行 核取方塊即可。我們也可以通...