- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
将源图像的平方加到累积器图像中。
 该函数将输入图像 src 或其选定区域提升到2的幂次方,然后加到累积器 dst 中:
  
      
       
        
        
          dst 
         
        
          ( 
         
        
          x 
         
        
          , 
         
        
          y 
         
        
          ) 
         
        
          ← 
         
        
          dst 
         
        
          ( 
         
        
          x 
         
        
          , 
         
        
          y 
         
        
          ) 
         
        
          + 
         
        
          src 
         
        
          ( 
         
        
          x 
         
        
          , 
         
        
          y 
         
         
         
           ) 
          
         
           2 
          
         
         
        
          if 
         
         
        
          mask 
         
        
          ( 
         
        
          x 
         
        
          , 
         
        
          y 
         
        
          ) 
         
        
          ≠ 
         
        
          0 
         
        
       
         \texttt{dst} (x,y) \leftarrow \texttt{dst} (x,y) + \texttt{src} (x,y)^2 \quad \text{if} \quad \texttt{mask} (x,y) \ne 0 
        
       
     dst(x,y)←dst(x,y)+src(x,y)2ifmask(x,y)=0
 函数支持多通道图像。每个通道独立处理。
函数原型
void cv::accumulateSquare	
(
	InputArray 	src,
	InputOutputArray 	dst,
	InputArray 	mask = noArray() 
)	
参数
- 参数src 输入图像,可以是单通道或三通道,8位或32位浮点数。
- 参数dst 累积器图像,通道数与输入图像相同,32位或64位浮点数。
- 参数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 sqSum = cv::Mat::zeros( frame.size(), CV_32F );
    // 模拟多帧累积
    for ( int i = 0; i < 100; ++i )
    {
        // 使用同一图像多次以模拟多帧情况
        cv::accumulateSquare( frame, sqSum );
    }
    // 防止累积平方和为0的情况
    sqSum += 1;  // 添加一个小常数避免分母为0
    // 计算累积平方和的最大值
    double maxVal;
    cv::minMaxLoc( sqSum, nullptr, &maxVal );
    // 将累积平方和转换回8位图像以便保存
    sqSum.convertTo( sqSum, CV_8U, 255.0 / maxVal );  // 归一化
    // 显示原始图像
    cv::imshow( "Original Image", frame );
    // 显示累积平方和结果图像
    cv::imshow( "Accumulated Square Result", sqSum );
    // 等待按键,以便查看图像
    cv::waitKey( 0 );
    // 关闭所有窗口
    cv::destroyAllWindows();
    // 保存结果
    cv::imwrite( "accumulated_square_result.jpg", sqSum );
    return 0;
}
运行结果









![[数据结构与算法·C++] 笔记 1.4 算法复杂性分析](https://i-blog.csdnimg.cn/direct/3269861109f847f5934ae53930581add.png#pic_center)
![[数据结构与算法·C++] 笔记 1.5类与对象](https://i-blog.csdnimg.cn/direct/66909446e57841c3b77f2f2b73d54c51.png)








