探索 怎樣去顯示fps

2021-06-27 09:03:26 字數 3254 閱讀 2363

前兩天把攝像頭網路傳輸程式搞定了,傳輸效果也挺不錯,至少沒有出現畫面錯誤。那接下來,我想**一下這個程式的效率:傳輸速度,顯示速度,記憶體占用等等。

先說速度的問題吧。說道速度,那就要拿東西來計時,計算每一幀需要消耗的時間,取個倒數,就是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 在聯想一下剛...

怎樣顯示過寬文件?

在開啟文件時,有時會發現因為文件過寬,螢幕上顯示不全,這可怎麼辦,總不能看一行就拖動一次水平滾動條吧!這時我們可以重新調整行的寬度,使其適合文件視窗的大小。如果使用的是普通檢視或大綱檢視,可以單擊 工具 選單中的 選項 命令,再單擊 檢視 選項卡,然後選中 視窗內自動換行 核取方塊即可。我們也可以通...