欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > [22] Opencv_CUDA应用之 使用背景相减法进行对象跟踪

[22] Opencv_CUDA应用之 使用背景相减法进行对象跟踪

2025/4/3 18:42:44 来源:https://blog.csdn.net/yohnyang/article/details/140137115  浏览:    关键词:[22] Opencv_CUDA应用之 使用背景相减法进行对象跟踪

Opencv_CUDA应用之 使用背景相减法进行对象跟踪

  • 背景相减法是在一系列视频帧中将前景对象从背景中分离出来的过程,它广泛应用于对象检测和跟踪应用中去除背景

  • 背景相减法分四步进行:图像预处理 -> 背景建模 -> 检测前景 -> 数据验证

      1. 预处理去除噪声
      1. 背景建模,以便与前景分离
      1. 利用当前帧和背景之间的绝对差,将前景与模型背景相分离,将这个绝对差于设置的阈值相比较:如果大于阈值,则对象被认为是移动的,否则是静止的。

1. 高斯混合法

  • 高斯混合法(MoG) 是一种广泛使用的基于高斯混合的背景减法,用于分离前景和背景
  • 背景从帧序列中不断更新,混合K高斯分布用于将像素分类为前景或者背景,同时对帧的时间序列进行加权,以改善背景建模。
  • 连续变化的强度被归类为前景强度,静态强度被归类为背景强度
  • 实现代码如下:
#include <iostream>
#include <string>
#include "opencv2/opencv.hpp"
#include<opencv2/cudabgsegm.hpp>using namespace std;
using namespace cv;
using namespace cv::cuda;
int main()
{VideoCapture cap("images/abc.avi");if (!cap.isOpened()){cerr << "can not open camera or video file" << endl;return -1;}Mat frame;cap.read(frame);GpuMat d_frame;d_frame.upload(frame);Ptr<BackgroundSubtractor> mog = cuda::createBackgroundSubtractorMOG();GpuMat d_fgmask, d_fgimage, d_bgimage;Mat h_fgmask, h_fgimage, h_bgimage;mog->apply(d_frame, d_fgmask, 0.01);while (1){cap.read(frame);if (frame.empty())break;d_frame.upload(frame);int64 start = cv::getTickCount();mog->apply(d_frame, d_fgmask, 0.01);mog->getBackgroundImage(d_bgimage);double fps = cv::getTickFrequency() / (cv::getTickCount() - start);std::cout << "FPS : " << fps << std::endl;d_fgimage.create(d_frame.size(), d_frame.type());d_fgimage.setTo(Scalar::all(0));d_frame.copyTo(d_fgimage, d_fgmask);d_fgmask.download(h_fgmask);d_fgimage.download(h_fgimage);d_bgimage.download(h_bgimage);cv::namedWindow("image", 0);cv::namedWindow("foreground mask", 0);cv::namedWindow("foreground image", 0);cv::namedWindow("mean background image", 0);imshow("image", frame);imshow("foreground mask", h_fgmask);imshow("foreground image", h_fgimage);imshow("mean background image", h_bgimage);cv::waitKey(0);if (waitKey(1) == 'q')break;}return 0;
}

在这里插入图片描述

2. GMG 背景相减法

  • GMG算法的名称源自该算法发明人的首字母,这个算法结合了背景估计与贝叶斯图像分割,使用贝叶斯推断将背景与前景分离,还使用帧的历史来建模
  • 它在此基于帧的时间序列进行加权,新的观测比旧的观测的权重还要高
  • 实现代码如下:
#include <iostream>
#include <string>
#include "opencv2/opencv.hpp"
#include "opencv2/cudabgsegm.hpp"
#include "opencv2/cudalegacy.hpp"using namespace std;
using namespace cv;
using namespace cv::cuda;int main(
)
{VideoCapture cap("images/abc.avi");if (!cap.isOpened()){cerr << "can not open video file" << endl;return -1;}Mat frame;cap.read(frame);GpuMat d_frame;d_frame.upload(frame);Ptr<BackgroundSubtractor> gmg = cuda::createBackgroundSubtractorGMG(40);GpuMat d_fgmask, d_fgimage, d_bgimage;Mat h_fgmask, h_fgimage, h_bgimage;gmg->apply(d_frame, d_fgmask);while (1){cap.read(frame);if (frame.empty())break;d_frame.upload(frame);int64 start = cv::getTickCount();gmg->apply(d_frame, d_fgmask, 0.01);double fps = cv::getTickFrequency() / (cv::getTickCount() - start);std::cout << "FPS : " << fps << std::endl;d_fgimage.create(d_frame.size(), d_frame.type());d_fgimage.setTo(Scalar::all(0));d_frame.copyTo(d_fgimage, d_fgmask);d_fgmask.download(h_fgmask);d_fgimage.download(h_fgimage);namedWindow("image", 0);namedWindow("foreground mask", 0);namedWindow("foreground image", 0);imshow("image", frame);imshow("foreground mask", h_fgmask);imshow("foreground image", h_fgimage);if (waitKey(30) == 'q')break;}return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词