Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用

本文主要是介绍Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

计算直方图的反向投影。

cv::calcBackProject 函数计算直方图的反向投影。也就是说,类似于 calcHist,在每个位置 (x, y),该函数收集输入图像中选定通道的值,并找到对应的直方图区间。但是,与其递增该区间值,该函数读取区间值,将其乘以 scale,并存储在 backProject(x, y) 中。从统计学的角度来看,该函数计算每个元素值相对于由直方图表示的经验概率分布的概率。例如,你可以如何找到并跟踪场景中的一个亮色物体:

在跟踪之前,让物体占据几乎整个画面,展示给摄像头。计算色调直方图。直方图可能会有强烈的峰值,对应于物体中的主导颜色。
在跟踪时,使用预先计算的直方图计算每个输入视频帧的色调平面的反向投影。对反向投影进行阈值处理以抑制弱颜色。可能还有意义的是抑制颜色饱和度不足、太暗或太亮的像素。
在结果图像中找到连通组件,并选择例如最大的组件。
这是 CamShift 颜色物体跟踪器的大致算法。

参数

  • 参数images 源数组。它们都应该具有相同的深度(CV_8U, CV_16U 或 CV_32F),并且具有相同的尺寸。每一个都可以有任意数量的通道。
  • 参数nimages 源图像的数量。
  • 参数channels用于计算反向投影的通道列表。通道的数量必须与直方图的维度相匹配。第一个数组的通道编号从 0 到 images[0].channels()-1,第二个数组的通道编号从 images[0].channels() 到 images[0].channels() + images[1].channels()-1,以此类推。
  • 参数hist 输入的直方图,它可以是密集的也可以是稀疏的。
  • 参数backProject 目标反向投影数组,它是一个单通道数组,具有与 images[0] 相同的尺寸和深度。
  • 参数ranges 每个维度的直方图区间边界的数组。参见 calcHist。
  • 参数scale 反向投影输出的可选比例因子。
  • 参数uniform 标志位,指示直方图是否是均匀的(参见上述说明)。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{Mat src, hsvImg, hist;vector< Mat > hsv;int histSize = 5;src = imread( "/media/dingxin/data/study/OpenCV/sources/images/qiu.jpg" );imshow( "src", src );//转换为 HSV 通道图像cvtColor( src, hsvImg, COLOR_BGR2HSV );imshow( "hsvImg", hsvImg );//通道分离split( hsvImg, hsv );imshow( "hImg", hsv[ 0 ] );int channels[]        = { 0 };float hr[]            = { 0, 180 };const float* ranges[] = { hr };calcHist( &hsv[ 0 ], 1, &channels[ 0 ], Mat(), hist, 1, &histSize, &ranges[ 0 ] );normalize( hist, hist, 255, 0, NORM_L1 );imshow( "hist", hist );//计算反向投影Mat backImg;calcBackProject( &src, 1, &channels[ 0 ], hist, backImg, &ranges[ 0 ], 1 );imshow( "backImg", backImg );waitKey( 0 );
}

运行结果

在这里插入图片描述

这篇关于Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131651

相关文章

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

Python3中Sanic中间件的使用

《Python3中Sanic中间件的使用》Sanic框架中的中间件是一种强大的工具,本文就来介绍Python3中Sanic中间件的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录Sanic 中间件的工作流程中间件的使用1. 全局中间件2. 路由中间件3. 异常处理中间件4. 异步中间件5. 优先级

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage