Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenCV/C++设置树莓相机模式_C++_Performance_Opencv_Raspberry Pi_Screen Resolution - Fatal编程技术网

使用OpenCV/C++设置树莓相机模式

使用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

我试图使用OpenCVs VideoCapture类设置Raspberry Pi Cameras模式,并使用下面的代码设置其属性。将其设置为640x480x30fps效果很好,但1920x1080x30 fps每秒只能传输3或4帧

谁能告诉我我错过了什么?非常感谢

#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的视频流已经不是什么疯狂的事情了。。。