C++实现运动目标的追踪

C++ 实现运动目标的追踪

一、介绍

本次实验将使用利用 OpenCV 来实现对视频中动态物体的追踪。

涉及的知识点

  • C++ 语言基础
  • g++ 的使用
  • 图像基础
  • OpenCV 在图像及视频中的应用
  • Meanshift 和 Camshift 算法

实验效果

本次实验要实现的效果是追踪太阳系中运动的行星(图中选择了浅绿颜色轨道上的土星,可以看到追踪的目标被红色的椭圆圈住):

1-1

二、环境搭建

进行本节的实验时,您需要先完成 C++实现太阳系行星运行系统 的相关实验,才能进行下面的相关学习。

2.1 创建视频文件

在实验楼环境中暂时还不支持连接用户计算机的摄像头进行实时取景,我们首先需要创建实验前的视频文件。

首先安装屏幕录制工具:

sudo apt-get update && sudo apt-get install gtk-recordmydesktop

安装完成后,我们能够在应用程序菜单中找到:

2.1-1

运行之前完成的太阳系行星系统程序 ./solarsystem 并使用 RecordMyDesktop 录制程序运行画面(10~30s 即可),并保存到 ~/Code/camshift 路径下,命名为 video

2.1-2

时间足够后停止录制便能得到一个.ogv结尾的视频文件video.ogv

2.1-3

2.2 图像基础

OpenCV 是一个开源的跨平台计算机视觉库,与 OpenGL 所提供的图像绘制不同,OpenCV 实现了图像处理和计算机视觉方面的很多通用的算法。在学习 OpenCV 之前,我们需要先了解一下图像、视频在计算机中的一些基本概念。

首先,我们要理解图片在计算机中的表示方式:图像在显示过程中以连续变化的形式而存在,但在计算机中,有两种常见的存储图片的方式:一种是矢量图,一种则是像素图。

矢量图,也称为面向对象的图像或绘图图像,在数学上定义为一系列由线连接的点。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。

而更常见的则是像素图,比如常说的一张图片的尺寸为1024*768,这就意味着这张图片水平方向上有1024个像素,垂直方向上有768个像素。

像素就是表示像素图的基本单位,通常情况下一个像素由三原色(红绿蓝)混合而成。由于计算机的本质是对数字的识别,一般情况下我们把一种原色按亮度的不同从 0~255 进行表示,换句话说,对于原色红来说,0表示最暗,呈现黑色,255表示最亮,呈现纯红色。

这样,一个像素就可以表示为一个三元组(B,G,R),比如白色可以表示为(255,255,255),黑色则为(0,0,0),这时我们也称这幅图像是 RGB 颜色空间中的一副图像,R、G、B 分别成为这幅图像的三个通道,除了 RGB 颜色空间外,还有很多其他的颜色空间,如 HSV、YCrCb 等等。

像素是表示像素图的基本单位,而图像则是表示视频的基本单位。一个视频由一系列图像组成,在视频中我们称其中的图像为帧。而通常我们所说的视频帧率,意味着这个视频每秒钟包含多少帧图像。比如帧率为 25,那么这个视频每秒钟就会播放25帧图像。

1秒钟共有1000毫秒,因此如果帧率为 rate 那么每一帧图像之间的时间间隔为 1000/rate

2.3 图像颜色直方图

颜色直方图是描述图像的一种工具,它和普通的直方图类似,只是颜色直方图需是根据某一幅图片计算而来。

如果一副图片是 RGB 颜色空间,那么我们可以统计 R 通道中,颜色值为 0~255 这 256 种颜色出现的次数,这边能获得一个长度为 256 的数组(颜色概率查找表),我们再将所有的值同时除以这幅图像中像素的总数,将这之后所得的数列转化为直方图,其结果就是颜色直方图。

2.4 直方图反向投影

人们已经证明,在 RGB 颜色空间中,对光照亮度变化较为敏感,为了减少此变化对跟踪效果的影响,就需要对直方图进行反向投影。这一共分为三个步骤:

  1. 首先将图像从RGB空间转换到HSV空间。
  2. 然后获取其中的 H 颜色通道的直方图。
  3. 将图像中每个像素的值用颜色概率查找表中对应的概率进行替换,就得到了颜色概率分布图。

这个过程就叫反向投影,

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 C++ 中使用 OpenCV 实现远距离目标追踪,你需要掌握以下几个步骤: 1. 获取视频流或图像。 2. 对图像进行预处理,包括调整大小、灰度化、平滑化等。 3. 使用 Haar 级联分类器或其他机器学习算法检测出目标物体。你可以使用 OpenCV 自带的 Haar 级联分类器或训练自己的分类器。 4. 根据检测到的目标物体,计算出目标物体的位置和跟踪矩形。 5. 根据目标物体的位置和跟踪矩形,在下一帧图像中寻找目标物体,并更新跟踪矩形。 6. 循环执行第 5 步,直到目标物体离开画面或停止运动。 下面是一个简单的示例代码,演示了如何使用 OpenCV 进行目标追踪: ``` #include <opencv2/opencv.hpp> using namespace cv; int main() { // 打开视频文件 VideoCapture cap("test.mp4"); if (!cap.isOpened()) return -1; // 创建 Haar 级联分类器 CascadeClassifier cascade; cascade.load("cascade.xml"); // 运行循环,处理每一帧图像 Mat frame; while (cap.read(frame)) { // 调整图像大小,提高处理速度 resize(frame, frame, Size(frame.cols / 2, frame.rows / 2)); // 灰度化和直方图均衡化,提高目标物体的对比度 Mat gray; cvtColor(frame, gray, COLOR_BGR2GRAY); equalizeHist(gray, gray); // 检测目标物体 std::vector<Rect> objects; cascade.detectMultiScale(gray, objects, 1.1, 3, 0, Size(30, 30)); // 更新目标物体的位置和跟踪矩形 for (auto& rect : objects) { rectangle(frame, rect, Scalar(0, 255, 0), 2); } // 显示图像并等待按键 imshow("frame", frame); if (waitKey(30) == 'q') break; } return 0; } ``` 其中,`cascade.xml` 文件是事先训练好的 Haar 级联分类器模型,你可以在网上找到现成的模型,也可以使用 OpenCV 自带的模型。在代码中,我们首先打开视频文件,然后创建 Haar 级联分类器,循环读取每一帧图像并进行预处理,最后使用分类器检测目标物体并更新跟踪矩形,同时显示图像并等待按键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值