C++ OpenCV使用InRange对HSV颜色进行分割

前言

上一篇中我们学习了《OpenCV---HSV颜色空间介绍》,对HSV的颜色进行了一个简单的了解,这一章我们在研究一下利用颜色把想到的数据获取出来。OpenCV中的inRange()函数可实现二值化功能(这点类似threshold()函数)

视频效果

API函数

void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)
官方文档中的解释:检查数组元素是否在另外两个数组元素值之间。这里的数组通常也就是矩阵Mat或向量。请注意:该函数输出的dst是一幅二值化之后的图像。

使用示例1:针对单通道图像
dst(I) = lowerb(I)0 ≤ src(I)0 < upperb(I)0
即,如果一幅灰度图像的某个像素的灰度值在指定的高、低阈值范围之内,则在dst图像中令该像素值为255,否则令其为0,这样就生成了一幅二值化的输出图像。

使用示例2:针对三通道图像
dst(I) = lowerb(I)0 ≤ src(I)0 < upperb(I)0 ∧ lowerb(I)1 ≤ src(I)1 < upperb(I)1 ∧lowerb(I)2 ≤ src(I)2 < upperb(I)2
即,每个通道的像素值都必须在规定的阈值范围内!


代码演示

我们再新建一个项目名为opencv--video2,按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法

C++ OpenCV使用InRange对HSV颜色进行分割_第1张图片

C++ OpenCV使用InRange对HSV颜色进行分割_第2张图片

我这里提前录了一个test6.mp4的视频,我们这里运行一下这个程序看看原始视频。

从视频中我们看到,里面我拿了一个蓝色的按摩器来镜头里来回晃动。

下面我们就通过InRange的函数把蓝色提取出来进行分割。在《》一篇中的颜色HSV的表格中我们可以看到蓝色的H范围在100-124之间,S的范围在43-255之间,V的范围在46-255之间,如下图:

C++ OpenCV使用InRange对HSV颜色进行分割_第3张图片

所以我们在代码中先把这两个范围值定义出来

C++ OpenCV使用InRange对HSV颜色进行分割_第4张图片

然后我们在视频播放的时候需要对原始图像转换变HSV图像,然后通过InRange把颜色分割后显示出来

C++ OpenCV使用InRange对HSV颜色进行分割_第5张图片

运行后的效果就是文章开始的视频,下面是视频中的屏幕截图

C++ OpenCV使用InRange对HSV颜色进行分割_第6张图片

上面的视频中我们可以看出来,蓝色的都已经获取下来了,说一下重点:

  1. 图像必须先通过cvtColor转换为HSV的图像

  2. 定义的Scalar里的三个数值就是以H,S,V的参数设置的


-END-

长按下方二维码关注微卡智享

你可能感兴趣的:(opencv,计算机视觉,python,css,javascript)