前言

上一篇中我们学习了《C++ OpenCV使用InRange对HSV颜色进行分割》,本身通过视频中可以看到我们通过颜色把按摩器提取了出来,这次我们基于上一章的成果,在上面实现原视频中的物体标识出来,呈现出追踪的效果。

实现效果视频





实现思路

  1. 对源视频用InRange进行颜色分割
  2. 对分割出来的图像进行形态学操作(开操作去燥)
  3. 然后再进行N闪的膨胀(N为整数,需要自己把握)
  4. 对膨胀后的形态进行查找轮廓
  5. 生成轮廓的外接矩形
  6. 在源图上把外接矩形绘制出来

代码实现

我们还是用上次的那个项目opencv--video2,按照配置属性(VS2017配置OpenCV通用属性),然后在原来的基础上增加一个矩形的定义,如下图红框所示:

opencv分离黑色区域 opencv颜色分割_编程语言

对源视频用InRange进行颜色分割

opencv分离黑色区域 opencv颜色分割_编程语言_02

对分割出来的图像进行开操作(先腐蚀后膨胀)

opencv分离黑色区域 opencv颜色分割_opencv分离黑色区域_03

再进行4次的膨胀操作,这一步的作用是因为视频中部门蓝色由于反光的问题会认为是白色,所以在颜色提取的时候会变成好几个色块,这样我们通过膨胀的操作把分散的色块融合到一起,具体的膨胀次数可以自己测试一下。我是直接填的4效果还不错。

opencv分离黑色区域 opencv颜色分割_编程语言_04

根据膨胀后的开关获取最小外接矩形

opencv分离黑色区域 opencv颜色分割_opencv分离黑色区域_05

上面我们用到了一个DealRect的函数,我们重点看一下这个函数,首先在文件最上面定义了DealRect的函数

opencv分离黑色区域 opencv颜色分割_数据可视化_06

然后我们再写DealRect的实现方法

opencv分离黑色区域 opencv颜色分割_数据可视化_07

opencv分离黑色区域 opencv颜色分割_数据可视化_08

最后我们在源图上绘制出外接矩形并把图像显示出来

opencv分离黑色区域 opencv颜色分割_编程语言_09

这样整个效果就完成了,生成的结果就是文章开始时的视频显示效果,下面是视频中的截图

opencv分离黑色区域 opencv颜色分割_编程语言_10

-END-