- 操作系统: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
函数支持多通道图像。每个通道独立处理。
函数原型
cpp
void cv::accumulateSquare
(
InputArray src,
InputOutputArray dst,
InputArray mask = noArray()
)
参数
- 参数src 输入图像,可以是单通道或三通道,8位或32位浮点数。
- 参数dst 累积器图像,通道数与输入图像相同,32位或64位浮点数。
- 参数mask 可选的操作掩码。
代码示例
cpp
#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;
}