首页 > 其他分享 >OpenCV运动分析和目标跟踪(1)累积操作函数accumulate()的使用

OpenCV运动分析和目标跟踪(1)累积操作函数accumulate()的使用

时间:2024-09-15 09:49:22浏览次数:12  
标签:累积 src dst mask CV OpenCV 图像 accumulate cv

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

算法描述

将一个图像添加到累积图像中。
该函数将 src 或其部分元素添加到 dst 中:
dst ( x , y ) ← dst ( x , y ) + src ( x , y ) if mask ( x , y ) ≠ 0 \texttt{dst} (x,y) \leftarrow \texttt{dst} (x,y) + \texttt{src} (x,y) \quad \text{if} \quad \texttt{mask} (x,y) \ne 0 dst(x,y)←dst(x,y)+src(x,y)ifmask(x,y)=0
该函数支持多通道图像。每个通道独立处理。
cv::accumulate 函数可以用于收集由静止相机拍摄的场景背景的统计数据,并用于进一步的前景-背景分割。

函数原型


void cv::accumulate	
(
	InputArray 	src,
	InputOutputArray 	dst,
	InputArray 	mask = noArray() 
)	

参数

  • 参数src 输入图像,类型为 CV_8UC(n),CV_16UC(n),CV_32FC(n) 或 CV_64FC(n),其中 n 是一个正整数。

  • 参数dst 累积图像,与输入图像具有相同数量的通道,并且深度为 CV_32F 或 CV_64F。

  • 参数mask 可选的操作掩码。

代码示例



#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
    // 加载一个真实的图像
    cv::Mat sourceImage = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/sun2.jpg", cv::IMREAD_COLOR );
    if ( sourceImage.empty() )
    {
        std::cout << "Error loading image" << std::endl;
        return -1;
    }

    // 获取源图像的尺寸和通道数
    cv::Size imageSize = sourceImage.size();
    int numChannels = sourceImage.channels();

    // 输出源图像的尺寸和类型
    std::cout << "Source Image Size: " << imageSize << std::endl;
    std::cout << "Source Image Type: " << sourceImage.type() << std::endl;
    std::cout << "Source Image Channels: " << numChannels << std::endl;

    // 创建一个空的累积图像
    cv::Mat cumulativeImage = cv::Mat::zeros(imageSize, CV_32FC(numChannels)); // 累积图像类型为 CV_32FC3

    // 输出累积图像的尺寸和类型
    std::cout << "Cumulative Image Size: " << cumulativeImage.size() << std::endl;
    std::cout << "Cumulative Image Type: " << cumulativeImage.type() << std::endl;
    std::cout << "Cumulative Image Channels: " << cumulativeImage.channels() << std::endl;

    // 将源图像转换为浮点类型
    cv::Mat sourceImageFloat;
    sourceImage.convertTo(sourceImageFloat, CV_32FC(numChannels), 1.0 / 255.0);

    // 输出转换后的图像尺寸和类型
    std::cout << "Converted Image Size: " << sourceImageFloat.size() << std::endl;
    std::cout << "Converted Image Type: " << sourceImageFloat.type() << std::endl;
    std::cout << "Converted Image Channels: " << sourceImageFloat.channels() << std::endl;

    // 创建一个掩码图像
    cv::Mat mask = cv::Mat::ones(imageSize, CV_8U) * 255; // 全部像素为255,即不使用掩码

    // 输出掩码图像的尺寸和类型
    std::cout << "Mask Image Size: " << mask.size() << std::endl;
    std::cout << "Mask Image Type: " << mask.type() << std::endl;

    // 确保累积图像和源图像的尺寸一致
    if (cumulativeImage.rows != sourceImageFloat.rows || cumulativeImage.cols != sourceImageFloat.cols) {
        std::cout << "Error: Cumulative image and source image do not have the same size." << std::endl;
        return -1;
    }

    // 确保累积图像和源图像的通道数一致
    if (cumulativeImage.channels() != sourceImageFloat.channels()) {
        std::cout << "Error: Cumulative image and source image do not have the same number of channels." << std::endl;
        return -1;
    }

    // 累积源图像到累积图像中
    int numAccumulations = 100; // 增加累加次数
    for (int i = 0; i < numAccumulations; ++i) {
        cv::accumulate(sourceImageFloat, cumulativeImage, mask);
    }

    // 显示累积图像
    cv::Mat normalizedCumulativeImage;
    cv::normalize(cumulativeImage, normalizedCumulativeImage, 0, 255, cv::NORM_MINMAX, CV_8U);

    // 使用高对比度的色彩映射
    cv::Mat enhancedCumulativeImage;
    cv::applyColorMap(normalizedCumulativeImage, enhancedCumulativeImage, cv::COLORMAP_JET);

    cv::imshow("Original Image", sourceImage);
    cv::imshow("Cumulative Image", enhancedCumulativeImage);
    
    cv::waitKey( 0 );
    return 0;
}

运行结果

在这里插入图片描述

标签:累积,src,dst,mask,CV,OpenCV,图像,accumulate,cv
From: https://blog.csdn.net/jndingxin/article/details/142255693

相关文章

  • 新电脑安装和配置pytorch、anaconda、CUDA、cuDNN、pycharm、OpenCV的过程记录
    显卡驱动和CUDA一、升级显卡驱动到官方最新版    1、打开英伟达官网,输入显卡芯片型号,手动搜索并下载显卡驱动。 NVIDIA官方驱动 ​    2、下载完成后安装驱动。 二、确认显卡支持的最高CUDA版本    1、键盘"win+R",调出运行输入cmd后点”......
  • OpenCV(cv::split())
    目录1.函数定义2.工作原理3.示例4.使用场景5.注意事项cv::split()是OpenCV提供的一个函数,用于将多通道图像分割成其各个单通道。该函数主要用于处理彩色图像和多通道矩阵,通常用于对图像中的每个颜色通道单独进行处理。1.函数定义voidcv::split(constMat&src,s......
  • OpenCV添加中文文字
    代码如下,随机在摄像头中添加文字importcv2importnumpyasnpfromrandomimportrandintfromPILimportImage,ImageDraw,ImageFontCOLOR=(255,0,0)font_size=24cap=cv2.VideoCapture(0)whilecap.isOpened():ret,frame=cap.read()width,height......
  • OpenCV(cv::dilate())
    目录1.函数定义2.工作原理3.示例4.应用场景5.膨胀和腐蚀的对比总结cv::dilate()是OpenCV中用于图像形态学变换的函数之一,与cv::erode()相对,它执行图像的膨胀操作。膨胀是一种将图像中的前景(白色区域)扩展的操作,通常用于填补图像中的小孔洞、连接分离的物体、或增强图......
  • OpenCV(cv::erode())
    目录1.函数定义2.工作原理3.示例4.应用场景总结cv::erode()是OpenCV中的图像形态学变换函数之一,用于执行图像的腐蚀操作。腐蚀是一种将图像中的白色区域缩小的操作,通常用于去除噪声、分离相邻的物体,或将小的图像细节消除。1.函数定义voidcv::erode(InputArraysrc......
  • OpenCV(cv::GaussianBlur())
    目录1.函数定义2.高斯模糊原理2.1高斯核\((3\times3)\)2.1.1高斯核的创建2.1.2卷积操作2.1.3边界处理2.1.4完成模糊处理2.1.5总结2.2高斯核\((5\times5)\)3.示例4.高斯核的生成5.高斯模糊的应用场景6.高斯模糊与其他模糊方式的对比7.总结cv::GaussianBlur()......
  • opencv-python学习笔记9-图像分割
    目录一、图像分割的概述、技术现状、应用:技术现状:传统图像分割技术:深度学习驱动的图像分割技术:应用领域:二、 图像分割的方法和分类:(1)基于阈值的分割方法:(2)基于区域的分割方法:(3)基于边缘的分割方法:(4)基于特定理论的分割方法:(5)基于深度学习的分割方法:三、图像分割的原理:......
  • opencv实战项目二十三:基于BEBLID描述符的特征点匹配实现表盘校正
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、特征点匹配介绍二、特征点检测三、特征描述符计算四,描述符的匹配筛选五,根据匹配结果映射图片六,整体代码:七,效果:前言在数字化时代,图像处理技术的应用日益广泛,其中表盘校正作为一项重要......
  • ubuntu20.04源码安装支持cuda的opencv4.5.5,显卡Geforce RTX4090
    ubuntu20.04源码安装支持cuda的opencv4.5.5,显卡GeforceRTX4090参考了这位博主的内容:https://blog.csdn.net/u013454780/article/details/128357962sudoapt-getupdatesudoapt-getupgrade安装依赖//安装前的必备包sudoapt-getinstallbuild-essentialsudoap......
  • 《OpenCV计算机视觉》—— 身份证号码识别案例
    文章目录一、案例实现的整体思路二、代码实现1.首先定义两个函数2.模板图像中数字的定位处理3.身份证号码数字的定位处理4.使用模板匹配,计算匹配得分,找到正确结果一、案例实现的整体思路下面是一个数字0~9的模板图片案例身份证如下:对数字模板的处理通过对模板......