OpenCV 非常慢 - 网络摄像头
OpenCV very slow - webcam
我正在使用 OpenCV 通过 UDP 将相机字节发送到另一台计算机。
问题是,相机的帧率只有 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));
}
我认为 UDP 每个数据包的最大理论数据大小约为 65KB,但大多数协议将此限制为几百字节以更安全 transmission.Seeing 因为视频是以 640 x 360 分辨率录制的,没有任何压缩,我可以向你保证每帧明显超过 65KB。因此,期望在受限管道中传输的帧速率等于摄像机记录的帧速率是非常不现实的。如果你想在接收器上获得更快的帧速率,要么降低视频的分辨率,要么使用合适的库,如 gstreamer,它在传输前提供视频的 h.264 压缩。
另一种解决方案是通过opencv对每一帧进行一些处理(例如简单的过滤器),这应该有助于减少每一帧的大小
另外,如果您发送的图片可以超过 200fps,那是什么意思?这个说法似乎没有任何意义
虽然 30 FPS 可能是您的相机的理论最大值,但在阳光明媚的日子里,在户外也可以达到。我有一个潜在的怀疑,低于标准的采集频率可能是由于照明不足造成的。它只需要更多的时间来捕捉足够的光子来产生所需质量的图像。我不确定您的采集条件是什么,但是使用更强的光可能会显着改善。如果您有权访问相机的内部设置,您还可以尝试减少曝光时间。然而,它需要增加增益才能保持适当的对比度,并且图像会表现出更多的噪声。
我正在使用 OpenCV 通过 UDP 将相机字节发送到另一台计算机。
问题是,相机的帧率只有 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));
}
我认为 UDP 每个数据包的最大理论数据大小约为 65KB,但大多数协议将此限制为几百字节以更安全 transmission.Seeing 因为视频是以 640 x 360 分辨率录制的,没有任何压缩,我可以向你保证每帧明显超过 65KB。因此,期望在受限管道中传输的帧速率等于摄像机记录的帧速率是非常不现实的。如果你想在接收器上获得更快的帧速率,要么降低视频的分辨率,要么使用合适的库,如 gstreamer,它在传输前提供视频的 h.264 压缩。
另一种解决方案是通过opencv对每一帧进行一些处理(例如简单的过滤器),这应该有助于减少每一帧的大小
另外,如果您发送的图片可以超过 200fps,那是什么意思?这个说法似乎没有任何意义
虽然 30 FPS 可能是您的相机的理论最大值,但在阳光明媚的日子里,在户外也可以达到。我有一个潜在的怀疑,低于标准的采集频率可能是由于照明不足造成的。它只需要更多的时间来捕捉足够的光子来产生所需质量的图像。我不确定您的采集条件是什么,但是使用更强的光可能会显着改善。如果您有权访问相机的内部设置,您还可以尝试减少曝光时间。然而,它需要增加增益才能保持适当的对比度,并且图像会表现出更多的噪声。