2015-02-24 244 views
1

我使用OpenCV通過UDP發送攝像頭字節到另一臺計算機。OpenCV非常慢 - 攝像頭

問題是,相機的幀率只有15fps。如果我發送圖片,它的工作速度超過200fps。

我的相機支持30fps,所以有人知道爲什麼會發生這種情況?

這裏是我的代碼:

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

#include <iostream> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <stdio.h> 
#include <fstream> 
#include <arpa/inet.h> 

#include <unistd.h> 

using namespace std; 
using namespace cv; 

void createSocket(int port, const char* ip); 
void sendData(vector<uchar> buff); 
int _socket; 

struct sockaddr_in serverAdress,clientAdress; 


// argv[1] = Bild 
int main(int argc, char** argv) 
{ 

    if(argc != 5) 
    { 
     cout << "Error\n"; 
     return -1; 
    } 

    createSocket(atoi(argv[2]),argv[1]); 

    vector<uchar> buff; 
    vector<int> param = vector<int>(2); 


    param[0] = CV_IMWRITE_JPEG_QUALITY; 
    param[1] = atoi(argv[3]); 


    // VideoCapture 
    VideoCapture cap(1); 
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); 
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 360); 


    if(!cap.isOpened()) 
    { 
     cout << "Error\n"; 
     return -1; 
    } 


    Mat frame; 

    while(true){ 

     cap >> frame; 

     cvtColor(frame, frame, CV_8U); 

     imencode(".jpeg",frame, buff,param); 
     cout<<"coded file size(jpg)"<<buff.size()<<endl; 
     sendData(buff); 
    } 


    return 0; 
} 


void createSocket(int port, const char* ip){ 
    _socket = socket(AF_INET,SOCK_DGRAM,0); 

    serverAdress.sin_family = AF_INET; 
    serverAdress.sin_addr.s_addr= inet_addr(ip); 
    serverAdress.sin_port=htons(port); 

    if(_socket == -1){ 
     cout << "Error"; 
     return; 
    } 

} 


void sendData(vector<uchar> buff){ 

    char data[buff.size()]; 
    for(int i = 0; i < buff.size(); i++){ 
     data[i] = buff.at(i); 
    } 

    sendto(_socket,data,buff.size(),0,(struct sockaddr *)&serverAdress,sizeof(serverAdress)); 
} 
+0

這是一個發佈版本嗎?我曾見過Visual Studio調試版本比發佈版本慢100倍的情況。 – drescherjm 2015-02-24 15:16:10

+0

沒有理由複製'sendData'中的數據 - 您可以發送'&buff [0]' - 並且您應該傳遞參數作爲常量引用來擺脫其他副本。應該刪除循環中的日誌輸出。 – molbdnilo 2015-02-24 15:48:20

+0

@drescherjm不需要調試 – ForJ9 2015-02-24 16:05:44

回答

1

儘管30 FPS可能是您的相機的理論最大值,但它可能在陽光明媚的日子外可達。我有一個偷偷摸摸的懷疑,即低於標準的採集頻率可能是由於照明不足造成的。它只需要更多的時間捕捉足夠的光子來產生所需質量的圖像。我不確定你的採集條件是什麼,但事情可能會在更強烈的光線下顯着改善。如果您可以訪問相機的內部設置,也可以嘗試減少曝光時間。然而,它需要增加增益以保持適當的對比度,並且圖像將顯示更多的噪聲。

0

我相信UDP按約65KB的數據包的最大theorotical數據大小,但大多數的協議限制這幾百個字節的安全transmission.Seeing作爲視頻被以640×360分辨率記錄而無任何壓縮,我可以向你保證每一幀都大大超過65KB。因此,期望在受約束管道中傳輸的幀速率等於相機記錄的幀速率是非常不現實的。如果你想在接收機上獲得更快的幀頻,要麼降低視頻分辨率,要麼使用像gstreamer這樣的合適的庫,它在傳輸前提供h.264壓縮視頻。

另一種解決方案是通過OpenCV的每一幀進行一些處理(如簡單過濾器),這應該有助於減少每幀

此外,如果你發送圖片你是什麼意思的大小,它的工作超過200fps?這種說法似乎沒有任何意義

+0

有壓縮。 (imencode(「。jpeg」,frame,buff,param);)一個幀的大小爲〜9k。我的意思是:如果我用imload(...,...)加載硬盤中的圖片;並通過UDP發送此幀,它將每秒發送超過200次。 – ForJ9 2015-02-24 16:13:08