c++ - 取实时网络摄像头帧的平均值

标签 c++ opencv image-processing

我首先使用这段代码来捕获网络摄像头帧:

int main(int argc, char** argv)
{
    VideoCapture cap(0); // open the default camera
    if (!cap.isOpened())  // check if we succeeded
        return -1;
    cap.set(CV_CAP_PROP_FPS, 15);

    std::vector<cv::Mat> images(100);
    for (framenumb = 0; framenumb < 100; ++framenumb)
    {
        // this is optional, preallocation so there's no allocation
        // during capture
        images[framenumb].create(480, 640, CV_32FC3);
    }
    for (framenumb = 0; framenumb < 100; ++framenumb)
    {
        Mat frame;
        cap >> frame;
        if (frame.empty()) break; // end of video stream
        imshow("webcam", frame);
        if (waitKey(1) == 27) break; // stop capturing by pressing ESC 
        frame.copyTo(images[framenumb]);
    }

然后尝试使用以下代码对捕获的帧进行平均:

Mat avgImg;
Mat capturedImg;
for (framenumb = 0; framenumb < 100; ++framenumb)
{
    avgImg.create(480, 640, CV_32FC3);
    capturedImg = images[framenumb];
    cv::accumulate(capturedImg, avgImg);
}
avgImg = avgImg / 100;
avgImg.convertTo(avgImg, CV_8UC3);
imshow("averaged", avgImg);

但是它只是破坏了程序并给了我一个黑色图像。谁能帮我找出错误在哪里?非常感谢

最佳答案

你需要:

  1. 创建零初始化累积图像
  2. 将每张图片添加到其中
  3. 将累积的图像除以图像数量

您改为在每一帧重新创建一个空的累积图像。

代码应更改为:

Mat avgImg(480, 640, CV_32FC3, Scalar()); // Create and zero initialize
Mat capturedImg;
for (framenumb = 0; framenumb < 100; ++framenumb)
{
    // avgImg.create(480, 640, CV_32FC3); // Don't create each time!
    capturedImg = images[framenumb];
    cv::accumulate(capturedImg, avgImg);
}

您可能可以将代码简化为:

Mat avgImg(480, 640, CV_32FC3, Scalar()); // Create and zero initialize
for (framenumb = 0; framenumb < 100; ++framenumb)
{
    avgImg += images[framenumb];
}

关于c++ - 取实时网络摄像头帧的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39893304/

相关文章:

c++ - 如何监控 C++ 守护进程?

c# - 将 C++ DLL 翻译成 C# - 如何翻译结构中包含的结构

c++ - 在单独的线程上填充、填充 QTreeView 树

python-2.7 - AWS Lambda 和 Numpy 库 - 导入多数组 numpy 扩展模块失败

opencv - 将 ElasticRTC 与自定义 AMI 一起使用

c - 树莓派和OpenCV的C语言库

linux - 是否可以从命令行对图像应用效果?

c# - 无论如何使用 asp.net mvc 从 3 个图像 URL 中制作一个图像?

image - 将立方体贴图坐标转换为等距矩形中的等效坐标

c++ - 手动反编译引用