我使用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));
}
這是一個發佈版本嗎?我曾見過Visual Studio調試版本比發佈版本慢100倍的情況。 – drescherjm 2015-02-24 15:16:10
沒有理由複製'sendData'中的數據 - 您可以發送'&buff [0]' - 並且您應該傳遞參數作爲常量引用來擺脫其他副本。應該刪除循環中的日誌輸出。 – molbdnilo 2015-02-24 15:48:20
@drescherjm不需要調試 – ForJ9 2015-02-24 16:05:44