使用OpenCV/C++设置树莓相机模式
我试图使用OpenCVs VideoCapture类设置Raspberry Pi Cameras模式,并使用下面的代码设置其属性。将其设置为640x480x30fps效果很好,但1920x1080x30 fps每秒只能传输3或4帧 谁能告诉我我错过了什么?非常感谢使用OpenCV/C++设置树莓相机模式,c++,performance,opencv,raspberry-pi,screen-resolution,C++,Performance,Opencv,Raspberry Pi,Screen Resolution,我试图使用OpenCVs VideoCapture类设置Raspberry Pi Cameras模式,并使用下面的代码设置其属性。将其设置为640x480x30fps效果很好,但1920x1080x30 fps每秒只能传输3或4帧 谁能告诉我我错过了什么?非常感谢 #include <opencv2/core.hpp> #include <opencv2/videoio.hpp> #include <opencv2/highgui.hpp> int main
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
int main (){
int height(1080);
int width(1920);
cv::VideoCapture cap(0);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, height);
cap.set(CV_CAP_PROP_FRAME_WIDTH, width);
cap.set(cv::CAP_PROP_FOURCC, 0x21);
cap.set(cv::CAP_PROP_FPS, 30);
cv::Mat currentFrame;
while(1){
cap >> currentFrame;
//do stuff
char c = (char)cv::waitKey(1);
if (c == 27) break;
}
}
这在很大程度上取决于内存
你的处理器负责那里的每一种计算操作
所以,为了以高分辨率渲染,您的处理器也必须具有高端容量,优化代码只是为了减少CPU负载
看这里
1920*1080*30=62208000像素分辨率更高,内存更多
640*480*30=9216000像素分辨率更低,内存更少
你的设备必须一个接一个地渲染这些像素,因此帧速率下降是正常的,你的计算机必须拥有强大的内存才能在一秒钟内为1920x1080计算62208000像素
编辑:另外,我想让你们看看这篇文章,它演示了为什么我们优先考虑帧速率而不是分辨率…你们有没有试过在一张100美元的显卡上玩一个相对现代的游戏?同样的区别 覆盆子Pi没有足够的处理能力或内存来捕获高质量的视频。这就是为什么640x480工作正常,但一旦你提高分辨率,FPS就会俯冲
优化代码可能会有所帮助,但Raspberry Pi的处理能力有限。您是否尝试过提高FPS?我认为这是一个性能问题……首先要做的是删除所有在中间循环的东西,看看硬件是否能够以这种速率简单地获取和丢弃帧。下一步要做的是,在不获取任何新数据的情况下,测试这些东西自己需要多长时间。只有当你知道时间在哪里被消耗时,你才能开始优化。@MarkSetchell:这当然是我做的第一件事,它显示了出来。关于这里的答案,我现在还不太明白,因为假设测量是正确的,捕获的CPU时间只有0.025秒左右,应该允许大约40fps。啊!为什么你对同一件事有两个问题?您的代码中似乎也有waitKey,但没有显示任何图像。部分原因是我对SO还不熟悉,并且仍在了解它的工作原理,部分原因是当我制定第一个线程时,我仍然关注视频录制问题,没有完全意识到捕获输出可能是关键问题。WaitKey是以前实验的一个残余,我还使用它来终止更长的循环,而不必在程序中按Ctrl-C键。不应该造成任何伤害吗?@MarkSetchell是的,我明白了。。。看起来它已经优化到可以达到的程度…这很有意义。这是我在此配置中的第一个项目。我没怎么考虑这些数字,于是绿色地认为现在2MP的视频流已经不是什么疯狂的事情了。。。