- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
更新一个运行平均值。
该函数计算输入图像 src 和累积器 dst 的加权和,使得 dst 成为帧序列的运行平均值:
  
      
       
        
        
          dst 
         
        
          ( 
         
        
          x 
         
        
          , 
         
        
          y 
         
        
          ) 
         
        
          ← 
         
        
          ( 
         
        
          1 
         
        
          − 
         
        
          alpha 
         
        
          ) 
         
        
          ⋅ 
         
        
          dst 
         
        
          ( 
         
        
          x 
         
        
          , 
         
        
          y 
         
        
          ) 
         
        
          + 
         
        
          alpha 
         
        
          ⋅ 
         
        
          src 
         
        
          ( 
         
        
          x 
         
        
          , 
         
        
          y 
         
        
          ) 
         
         
        
          if 
         
         
        
          mask 
         
        
          ( 
         
        
          x 
         
        
          , 
         
        
          y 
         
        
          ) 
         
        
          ≠ 
         
        
          0 
         
        
       
         \texttt{dst} (x,y) \leftarrow (1- \texttt{alpha} ) \cdot \texttt{dst} (x,y) + \texttt{alpha} \cdot \texttt{src} (x,y) \quad \text{if} \quad \texttt{mask} (x,y) \ne 0 
        
       
     dst(x,y)←(1−alpha)⋅dst(x,y)+alpha⋅src(x,y)ifmask(x,y)=0
 也就是说,alpha 调节更新速度(累积器“忘记”早期图像的速度有多快)。该函数支持多通道图像。每个通道独立处理。
accumulateWeighted是OpenCV中的一个函数,用于计算图像序列的加权平均值。这个函数对于背景减除、运动检测等计算机视觉应用非常有用。它可以动态地更新一个图像的加权平均值,而不需要存储整个图像序列。
函数原型
void cv::accumulateWeighted	
(
	InputArray 	src,
	InputOutputArray 	dst,
	double 	alpha,
	InputArray 	mask = noArray() 
)		
参数
- 参数src 输入图像,可以是单通道或三通道,8位或32位浮点数。
- 参数dst 累积器图像,通道数与输入图像相同,32位或64位浮点数。
- 参数alpha 输入图像的权重。
- 参数mask 可选的操作掩码。
示例代码
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
    // 加载图像
    cv::Mat frame = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", cv::IMREAD_GRAYSCALE );
    if ( !frame.data )
    {
        std::cout << "Could not open or find the image" << std::endl;
        return -1;
    }
    // 初始化累积加权平均图像
    cv::Mat weightedAverage = cv::Mat::zeros( frame.size(), CV_32F );
    // 设置权重系数
    double alpha = 0.05;  // 减小权重系数,使累积效果更平滑
    // 模拟多帧累积
    int numFrames = 100;  // 大幅增加累积次数
    for ( int i = 0; i < numFrames; ++i )
    {
        // 使用同一图像多次以模拟多帧情况
        cv::accumulateWeighted( frame, weightedAverage, alpha );
        // 打印累积过程中的最小值和最大值,以便调试
        double minVal, maxVal;
        cv::minMaxLoc( weightedAverage, &minVal, &maxVal );
        std::cout << "Frame " << i + 1 << ": MinVal = " << minVal << ", MaxVal = " << maxVal << std::endl;
    }
    // 归一化处理
    double minVal, maxVal;
    cv::minMaxLoc( weightedAverage, &minVal, &maxVal );
    // 将累积加权平均图像转换回8位图像以便显示
    cv::Mat normalizedWeightedAverage;
    if ( maxVal > minVal )
    {
        weightedAverage.convertTo( normalizedWeightedAverage, CV_8U, 255.0 / ( maxVal - minVal ), -minVal * ( 255.0 / ( maxVal - minVal ) ) );
    }
    else
    {
        // 如果最大值等于最小值,直接归一化为255
        weightedAverage.convertTo( normalizedWeightedAverage, CV_8U, 255.0 );
    }
    // 显示原始图像
    cv::imshow( "Original Image", frame );
    // 显示累积加权平均结果图像
    cv::imshow( "Weighted Average Result", normalizedWeightedAverage );
    // 等待按键,以便查看图像
    cv::waitKey( 0 );
    // 关闭所有窗口
    cv::destroyAllWindows();
    // 保存结果
    cv::imwrite( "weighted_average_result.jpg", normalizedWeightedAverage );
    return 0;
}
运行结果

 感觉这个函数没怎么起作用,两张图是一样的,希望有高人能指导这个函数怎么用才效果明显



















