当前位置: 首页 > news >正文

OpenCV运动分析和目标跟踪(3)计算图像序列的加权平均值函数accumulateWeighted()的使用

  • 操作系统: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)(1alpha)dst(x,y)+alphasrc(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{// 如果最大值等于最小值,直接归一化为255weightedAverage.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;
}

运行结果

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

http://www.lryc.cn/news/446751.html

相关文章:

  • vue3中echarts柱状图横轴文字太多放不下怎么解决
  • Web 开发安全与最佳实践:MVC、会话管理与常见攻击防御
  • Segformer双显卡推理速度测试
  • 使用在线电子模拟器 Wokwi 运行 ESP32 示例(Arduino IDE、ESP32C3)
  • vue3+element-plus icons图标选择组件封装
  • Spring validation校验框架
  • UBUNTU20.04安装CH384串口卡驱动
  • JWT(JSON Web Tokens) 详细介绍
  • 数据结构练习题————(二叉树)——考前必备合集!
  • 一天认识一个硬件之鼠标
  • Django 请求配置
  • 轮播图组件更加完善版
  • cpu路、核、线程
  • 鸿蒙开发(NEXT/API 12)【硬件(注册出行业务事件监听)】车载系统
  • 安卓中有main函数吗?
  • js-17-对数组、对象进行浅拷贝和深拷贝
  • Ubuntu24.04中安装Electron
  • CPU中也应用到了缓存:CPU3层高速缓存,以及它的缓存一致性问题、MESI协议和Java的一些应用
  • 如何使用开发者工具捕获鼠标右键点击事件
  • 【几何】个人练习-Leetcode-1453. Maximum Number of Darts Inside of a Circular Dartboard
  • 啤酒:从饮品到文化的演变
  • Java 中 Map 常用类和数据结构详解
  • 实时监控,动态调整 —— 淘宝商品详情API助力商家实现灵活经营
  • WebGL常用接口和事件
  • Golang | Leetcode Golang题解之第429题N叉树的层序遍历
  • 数据库的全透明加密和半透明加密主要是针对数据存储安全的不同处理方式
  • MySQL的登录、访问、退出
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25
  • PyTorch框架安装
  • 分布式锁优化之 使用lua脚本改造分布式锁保证判断和删除的原子性(优化之LUA脚本保证删除的原子性)