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

news2024/11/15 10:37:52
  • 操作系统: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
    {
        // 如果最大值等于最小值,直接归一化为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;
}

运行结果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CANopen通讯协议笔记

CANopen通讯协议笔记 CANopen 通信对象编号CANopen整体框架网络管理&#xff08;NMT&#xff09;主要任务上线报文心跳报文过程数据对象&#xff08;PDO&#xff09;SDO服务数据对象对象字典概述 CANopen 通信对象编号 CANopen报文传输采用 CAN 标准帧格式。 这里的CAN-ID也叫…

ARM(Day 2)

一、作业 &#xff08;1&#xff09;汇编代码 .text.globl _start_start:mov r0, #0x5mov r1, #0x10比较r0,r1 是否相等 相等执行stop 不相等执行下一步比较&#xff08; r0 > r1 ?&#xff09;cmp r0, r1 比较实际在做减法 (YES NO )subhi r0, r0, r1 r0 > r1 …

浅谈Spring Cloud:OpenFeign

RestTemplate 方式调用存在的问题&#xff1a; String url "http://userservice/user/" order.getUserId(); User user restTemplate.getForObject(url, User.class); 这是通过URL地址来访问的。但是&#xff1a; 代码可读性差&#xff0c;编程体验不统一参数复…

NCNN 源码(1)-模型加载-数据预处理-模型推理

参考 ncnn 第一个版本的代码。 0 整体流程 demo&#xff1a;squeezenet ncnn 自带的一个经典 demo&#xff1a;squeezenet 的代码: // 网络加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_…

对象关系映射ORM

目录 ORM【重要】 1、 什么是ORM 2、 实体类 3、 ORM改造登录案例 ORM【重要】 1、 什么是ORM 目前使用JDBC完成了CRUD,但是现在是进行CRUD,增删改方法要设计很多参数,查询的方法需要设计集合才能返回. 在实际开发中,我们需要将零散的数据封装到对象处理. ORM (Object Rela…

在曲线图上最值和极值点位置进行适当标注

1、首先生成一组0-100的随机数&#xff0c;组内共有100个数据&#xff1b; yyrandi([0,100],[1,100]); 2、求这组数据的功率谱密度&#xff0c;并绘图&#xff1b; msize(yy,2); xdft fft(yy); % 计算功率谱密度 psd (1/m) * abs(xdft).^2; x1:m; loglog(x,psd,Linewid…

恶意windows程序

Lab07-01.exe分析&#xff08;DOS攻击&#xff09; 1.当计算机重启后&#xff0c;这个程序如何确保它继续运行(达到持久化驻留)? 创建Malservice服务实现持久化 先分析sub_401040桉函数 尝试获取名为HGL345互斥量句柄&#xff0c;如果不存在则直接结束流程&#xff1b;如果存…

【设计模式】万字详解:深入掌握五大基础行为模式

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【设计模式】&#xf…

主语部分、谓语部分、限定动词 (谓语动词) 和非限定动词 (非谓语动词)

主语部分、谓语部分、限定动词 {谓语动词} 和非限定动词 {非谓语动词} 1. 主语部分 (subject)1.1. Forms of the subject 2. 谓语部分 (predicate)2.1. Cambridge Dictionary2.2. Longman Dictionary of Contemporary English2.3. 谓语部分和谓语动词2.4. Traditional grammar …

240922-Ollama使用Embedding实现RAG

A. 最终效果 B. 文本分块代码 #%% from PyPDF2 import PdfReader from langchain.text_splitter import CharacterTextSplitterpdf_path 2023-LiuGuokai-Meas.pdf pdf_reader PdfReader(pdf_path) text "" for page in pdf_reader.pages:text page.extract_text…

2024年最新 Python 大数据网络爬虫技术基础案例详细教程(更新中)

网络爬虫概述 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称为网页蜘蛛&#xff08;Web Spider&#xff09;或网络机器人&#xff08;Web Robot&#xff09;&#xff0c;是一种自动化程序或脚本&#xff0c;用于浏览万维网&#xff08;World Wide Web&#xf…

(学习总结)STM32CubeMX HAL库 学习笔记撰写心得

STM32CubeMX学习笔记撰写心得 引言 在深入学习和实践STM32系列微控制器的开发过程中&#xff0c;我经历了从标准库到HAL库&#xff0c;再到结合STM32CubeMX进行项目开发的转变。这一过程中&#xff0c;我深刻体会到了STM32CubeMX在配置和代码生成方面的强大与便捷。为了检验自…

哈希简单介绍

1.直接定址法&#xff08;值的分布范围集中&#xff09; 比如统计字符串中字符出现的字数&#xff0c;字符范围是集中 2.除留余数法&#xff08;值的分布范围分散&#xff09; hashkey%n 哈希冲突&#xff1a;不同的值映射到相同的位置 解决哈希冲突的方案&#xff1a; 闭散…

抖音短视频矩阵系统OEM源码开发注意事项,功能开发细节流程全揭秘

抖音短视频矩阵系统OEM源码开发注意事项,功能开发细节流程全揭秘 在当今数字化时代背景下&#xff0c;短视频产业正经历前所未有的快速发展。其中&#xff0c;抖音凭借其创新的算法及多元内容生态获得巨大成功&#xff0c;吸引了众多用户。对于意欲进入短视频领域的创业者而言&…

【RocketMQ】一、基本概念

文章目录 1、举例2、MQ异步通信3、背景4、Rocket MQ 角色概述4.1 主题4.2 队列4.3 消息4.4 生产者4.5 消费者分组4.6 消费者4.7 订阅关系 5、消息传输模型5.1 点对点模型5.2 发布订阅模型 1、举例 以坐火车类比MQ&#xff1a; 安检大厅就像是一个系统的门面&#xff0c;接受来…

springboot地方特色美食分享系统-计算机毕业设计源码02383

摘要 本论文主要论述了如何使用SpringBoot技术开发一个地方特色美食分享系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述地方特色美食分享系统的当前背景以…

数据结构与算法——Java实现 8.习题——移除链表元素(值)

祝福你有前路坦途的好运&#xff0c;更祝愿你能保持内心光亮 纵有风雨&#xff0c;依然选择勇敢前行 —— 24.9.22 203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示…

uniapp 微信小程序 订阅消息功能实现

该网址 https://api.weixin.qq.com 上线后不可访问&#xff0c;调用该网址操作需在后端&#xff08; 重要&#xff01; 重要&#xff01; 重要&#xff01;&#xff09; 1.首先拿到的三个码 //微信公众平台 //https://mp.weixin.qq.com const wxappid "管理-开发管理-A…

手机号归属地查询-运营商归属地查询-手机号归属地信息-运营商手机号归属地查询接口-手机号归属地

手机号归属地查询接口是一种网络服务接口&#xff0c;它允许开发者通过编程方式查询手机号码的注册地信息。这种接口通常由第三方服务提供商提供&#xff0c;并可通过HTTP请求进行调用。以下是一些关于手机号归属地查询接口的相关信息&#xff1a; 1. 接口功能 归属地查询&am…

51单片机——矩阵键盘

一、矩阵键盘原理图 我们发现: P17,P16,P15,P14控制行&#xff0c; P13,P12,P11,P10控制列。 所以我们如果要选择第四列&#xff0c;只需要把整个P1先给高电位1&#xff0c;再把P10给低电位0。 二、代码 P10xFF; P100; if(P170){Delay(20);while(P170);Delay(20);KeyNum…