点击上方“AI算法与图像处理”,选择加"星标"或“置顶”

重磅干货,第一时间送达

我计划分享一些有趣的实战项目,或许达不到商用的级别,但是希望能在大家做项目的时候能够提供一些思路!如果对你有所帮助,给我点赞 & 在看,让我知道对你有帮助哈!

基于OpenCV的颜色检测和分割的隐形斗篷

如果你是个哈利波特迷,你就会知道什么是隐形衣。是的!这是哈利波特用来隐身的隐形衣。当然,我们都知道隐形衣不是真的——它都是图形上的诡计。

在这篇文章中,我们将学习如何使用OpenCV中的简单计算机视觉技术创建我们自己的“隐形衣”。文末会分享 C++和python的代码。

哈利波特的隐身衣效果

那是哈利·波特在试他的隐形衣!

事实上,你可以用一种叫做颜色检测和分割的图像处理技术来创造这种神奇的体验。好消息是,你不需要成为霍格沃茨的一员!你所需要的是一块红色的布,并遵循这篇文章。

看看下面的视频,我在那里尝试我自己的隐形衣!

颜色坚持+分割的demo效果

它的原理是什么?

该算法在原理上与绿幕非常相似。但与我们删除背景的绿幕不同,在这个应用中,我们删除了前景!

我们用一块红色的布做我们的斗篷。为什么是红色呢?为什么不绿色的吗?当然,我们可以用绿色,红色不是魔术师的颜色吗?除了此之外,像绿色或蓝色这样的颜色也可以稍微调整一下。

其基本思想如下:

1. 捕获并存储背景帧。

2. 使用颜色检测算法检测红色布料。

3. 将红色的布料分割成一个mask。

4. 生成最后的增广输出,创造神奇的效果。

上面的GIF简单地解释了算法的所有阶段。现在我们将详细讨论每一步。

步骤1:捕捉并存储背景帧

如上所述,关键思想是将当前与布料相对应的帧像素替换为背景像素,从而产生一件隐身衣的效果。为此,我们需要存储一个背景帧。

C++

// Create a VideoCapture object and open the input file
// If the input is the web camera, pass 0 instead of the video file name
VideoCapture cap("video4.mp4");
// Check if camera opened successfully
if(!cap.isOpened()){cout << "Error opening video stream or file" << endl;return -1;
}Mat background;
for(int i=0;i<30;i++)
{cap >> background;
}
//Laterally invert the image / flip the image.
flip(background,background,1);

Python

# Creating a VideoCapture object
# This will be used for image acquisition later in the code.
cap = cv2.VideoCapture("video.mp4")# We give some time for the camera to warm-up!
time.sleep(3)background=0for i in range(30):ret,background = cap.read()# Laterally invert the image / flip the image.
background = np.flip(background,axis=1)

在上面的代码中,cap.read()方法使我们能够通过相机捕获最新的帧(存储在变量‘background’中),它还返回一个布尔值(True/False存储在‘ret’中)。如果一个帧被正确读取,它将为真。所以你可以通过检查这个返回值来检查视频的结束。

为什么捕获背景图像使用'循环' ?

因为背景是静态的,我们不能简单地使用一个帧吗?当然,但是与多帧图像相比,捕获的图像有点暗。这是因为相机刚刚开始捕捉帧,因此它的参数还不稳定。因此,使用for循环捕获静态背景的多个图像就可以完成这个任务。

多帧平均也可以降低噪声。

第二步:检测红色

因为我们使用了一块红色的布来将它转换成一件隐形斗篷,所以我们将着重于在框架中检测红色。

听起来简单吗?我们有一个RGB(红-绿-蓝)图像,使用简单阈值的R通道来得到我们的mask。结果证明,这将并不会特别有效,因为RGB值是高度敏感的照明。因此,即使斗篷是红色的,也可能有一些区域,由于阴影,相应像素的红色通道值相当低。

正确的方法是将图像的颜色空间从 RGB转换为HSV(色相-饱和度-亮度)。

HSV颜色空间是什么?

HSV颜色空间表示使用三个值的颜色

1.色相(Hue):这个通道对颜色信息进行编码。色相可以被认为是一个角度,0度对应红色,120度对应绿色,240度对应蓝色。

2.饱和度(Saturation):这个通道编码颜色的强度/纯度。例如,粉色比红色的饱和度低。

3.值(Value):该通道对颜色的亮度进行编码。图像的阴影和光泽成分出现在这个通道中。

不像RGB是根据三原色来定义的,HSV的定义方式类似于人类感知颜色的方式。

对于我们的应用而言,使用 HSV 颜色空间的主要优点是颜色/色调/波长仅由色相组件表示。

要了解不同的色彩空间,请参考我们关于色彩空间的详细博客

https://www.learnopencv.com/color-spaces-in-opencv-cpp-python/

所以当我说,我需要一个特定的颜色,选择色相组件,然后根据饱和度组件,我得到了那个颜色的不同的阴影,进一步根据值组件,我得到了一个颜色的特定阴影的不同的强度。

在下面的代码中,我们首先捕获一个活动帧,将图像从RGB转换为HSV颜色空间,然后定义一个特定范围的H-S-V值来检测红色。

C++

Mat frame;
// Capture frame-by-frame
cap >> frame;// Laterally invert the image / flip the image
flip(frame,frame,1);//Converting image from BGR to HSV color space.
Mat hsv;
cvtColor(frame, hsv, COLOR_BGR2HSV);Mat mask1,mask2;
// Creating masks to detect the upper and lower red color.
inRange(hsv, Scalar(0, 120, 70), Scalar(10, 255, 255), mask1);
inRange(hsv, Scalar(170, 120, 70), Scalar(180, 255, 255), mask2);// Generating the final mask
mask1 = mask1 + mask2;

Python

# Capturing the live frame
ret, img = cap.read()# Laterally invert the image / flip the image
img  = np.flip(imgaxis=1)# converting from BGR to HSV color space
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)# Range for lower red
lower_red = np.array([0,120,70])
upper_red = np.array([10,255,255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)# Range for upper range
lower_red = np.array([170,120,70])
upper_red = np.array([180,255,255])
mask2 = cv2.inRange(hsv,lower_red,upper_red)# Generating the final mask to detect red color
mask1 = mask1+mask2

inRange 函数简单地返回一个二值化掩码,其中白色像素(255)表示属于上限和下限范围的像素,黑色像素(0)不属于上限和下限范围的像素。

色相值 实际上分布在一个圆上(范围在0-360度之间),但在OpenCV中为了适应8bit 值,其范围是0-180度。红色由0-30和150-180值表示。

我们使用范围0-10和170-180,以避免检测皮肤为红色。饱和度使用较高范围120-255的值,因为我们的布料应该是高度饱和的红色。亮度值在的较低范围是70,这样我们也可以在布料的褶皱中检测到红色。

mask1 = mask1 + mask2

使用上面的线,我们合并两个红色范围生成的mask。它基本上是在像素上进行OR操作。这是一个操作符重载+的简单例子。

现在,您已经了解了如何进行颜色检测,您可以更改H-S-V范围,并使用一些其他的单色布来代替红色。事实上,绿色的布比红色的效果更好,因为绿色离人的肤色差异最大。

第三步:将检测到的红色布料分割开来

在上一步中,我们生成了一个mask来确定帧中与检测到的颜色相对应的区域。我们精炼这个mask,然后用它从frame上分割布料。下面的代码说明了它是如何实现的。

C++

Mat kernel = Mat::ones(3,3, CV_32F);
morphologyEx(mask1,mask1,cv::MORPH_OPEN,kernel);
morphologyEx(mask1,mask1,cv::MORPH_DILATE,kernel);// creating an inverted mask to segment out the cloth from the frame
bitwise_not(mask1,mask2);
Mat res1, res2, final_output;// Segmenting the cloth out of the frame using bitwise and with the inverted mask
bitwise_and(frame,frame,res1,mask2);

Python

mask1 = cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.ones((3,3),np.uint8))
mask1 = cv2.morphologyEx(mask, cv2.MORPH_DILATE, np.ones((3,3),np.uint8))#creating an inverted mask to segment out the cloth from the frame
mask2 = cv2.bitwise_not(mask1)#Segmenting the cloth out of the frame using bitwise and with the inverted mask
res1 = cv2.bitwise_and(img,img,mask=mask2)

步骤4:生成最终的增强输出,以创建一个神奇的效果。

最后,我们将检测到的红色区域的像素值替换为静态背景对应的像素值,最后生成一个增强输出,产生神奇的效果,将我们的布料变成了一件隐身斗篷。为此,我们首先使用bitwise_and操作创建一个像素值对应于检测区域的图像,像素值等于静态背景的像素值,然后将输出添加到我们从中分割出红布的图像(res1)中。

C++

// creating image showing static background frame pixels only for the masked region
bitwise_and(background,background,res2,mask1);// Generating the final augmented output.
addWeighted(res1,1,res2,1,0,final_output);
imshow("magic", final_output);
waitKey(1);

Python

# creating image showing static background frame pixels only for the masked region
res2 = cv2.bitwise_and(background, background, mask = mask1)#Generating the final output
final_output = cv2.addWeighted(res1,1,res2,1,0)
imshow("magic",final_output)
cv2.waitKey(1)

参考

https://www.learnopencv.com/invisibility-cloak-using-color-detection-and-segmentation-with-opencv/

获取方式

关注作者的【AI算法与图像处理】公众号,后台回复【隐身衣】,即可获取源码和素材

长按关注【AI算法与图像处理

获取更多计算机视觉学习资源

下载1

在「AI算法与图像处理」公众号后台回复:yolov4即可下载 YOLOv4 trick相关论文

下载2

在「AI算法与图像处理」公众号后台回复:速查表即可下载包括 21张经典查找表

个人微信(如果没有备注不拉群!)
请注明:地区+学校/企业+研究方向+昵称

OpenCV黑魔法之隐身衣 | 附源码相关推荐

  1. 超简单的pyTorch训练-onnx模型-C++ OpenCV DNN推理(附源码地址)

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为1974字,预计阅读5分钟 前言 很早就想学习深度学习了,因为平时都是自学,业余时间也有限,看过几个pyTorch的入门,都是一 ...

  2. 实战 | 计算器/数码管数字识别 基于OpenCV和EasyOCR/PaddleOCR(附源码)

    点击下方卡片,关注"OpenCV与AI深度学习"公众号! 视觉/图像重磅干货,第一时间送达! 导读 本文主要介绍一个计算器显示数字识别的OCR实例,基于OpenCV和EasyOCR ...

  3. PyQt5 + Python3.7 + OpenCV人脸识别身份认证系统(附源码)

    基于PyQt5 + Python3.7 + OpenCV实现的人脸识别身份认证系统,附源码. 技术选型 PyQt5 + Python3.7 + OpenCV 功能概述 实现人员注册,信息修改,人脸识别 ...

  4. OpenCvSharp (C# OpenCV) DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别、骰子识别、菜品识别)(附源码)

    本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别.骰子识别.菜品识别)! 前言: 下 ...

  5. opencv判断 线夹角_python opencv实现直线检测并测出倾斜角度(附源码+注释)

    由于学习需要,我想要检测出图片中的直线,并且得到这些直线的角度.于是我在网上搜了好多直线检测的代码,但是没有搜到附有计算直线倾斜角度的代码,所以我花了一点时间,自己写了一份直线检测并测出倾斜角度的代码 ...

  6. Halcon转OpenCV实例--去除纸张中的颜色笔迹/墨迹(附源码)

    导读 本文主要介绍一个去除纸张中颜色笔迹/墨迹的实例,并将Halcon实现转为OpenCV. 实例来源 实例来源于51Halcon论坛的讨论贴: https://www.51halcon.com/fo ...

  7. 使用OpenCV处理图片的亮度、对比度、曝光、高光、阴影、饱和度、色温,色相(附源码)

    屏幕录制2023-05-22 22.09.32 集成opencv的方式请参照上一个帖子 OpenCV在iOS端的集成及Mat和UIImage互相转化(附源码) 废话不多说直接上代码,伸手党福利: 代码 ...

  8. cvtcolor python opencv_13行代码实现:Python实时视频采集(附源码)

    程序逻辑 Python实时视频采集程序主要流程共分为10个步骤,具体如下图所示: 流程描述: 库文件导入:导入程序依赖的python安装包: 摄像头管理对象创建和初始化:是对opencv VideoC ...

  9. yolov5检测小目标(附源码)

    yolov5小目标检测(图像切割法附源码) 6.30 更新切割后的小图片的label数据处理 前言 yolov5大家都熟悉,通用性很强,但针对一些小目标检测的效果很差. YOLOv5算法在训练模型的过 ...

  10. Python毕设-【课堂人脸签到系统】附源码课件/Python练手项目/Python毕业设计

    Python毕设-[课堂人脸签到系统]附源码课件/允许白嫖 文章目录 Python毕设-[课堂人脸签到系统]附源码课件/允许白嫖 系统简介 一.本课题拟解决的问题 二.系统技术栈 三.开发工具 四.数 ...

最新文章

  1. pytorch之expand,gather,squeeze,sum,contiguous,softmax,max,argmax
  2. 中国矿业大学计算机学院机房,2020年中国矿业大学计算机学院初试自命题科目考试大纲-数据结构...
  3. 记录零基础GO编程入门笔记之一
  4. boost::python::converter::as_to_python_function相关的测试程序
  5. Dubbo(八)之API 配置
  6. ssh报错解决 ECDSA host key for 123.56.11.181 has changed and you have requested strict checking.
  7. android progressbar 水平动画,Android ProgressBar 自定义样式(三),动画模式
  8. Netty空闲心跳检测机制
  9. matconvnet在MATLAB2013配置过程中遇到的问题
  10. zabbix 3.0 监控mysql_Zabbix-3.0.3 使用自带模板监控 MySQL
  11. linux下的web安全机制,linux http服务器web网页的不同安全机制
  12. java 编辑pdf表格_Java 生成pdf表格文档
  13. 安卓kotlin教程
  14. migration php,PHP日记——Lavarel常用语句之Migration篇
  15. (强烈推荐)基于SSM和BootStrap的共享云盘系统设计(项目开发与实现:注册/登录)
  16. Hanzi Weiter的简单应用小案例,在HTML汉字的书写,演示汉字笔画顺序的 汉字笔画库 js vue案例实例
  17. 【密码算法 之零】对称算法(DES,、3DES、 AES、DM5、HMAC、CMAC、SHAxx、SM3、SM4),非对称算法(RSA、ECC、ECDSA、ECDH、SM2、SM9...)
  18. Avoid adding reactive properties to a Vue instance or its root $data at runtime - declar
  19. python标识符_python标识符
  20. 南通大学计算机学院顾飘,解密通大软件专业“学霸”们的考研之路_南通大学...

热门文章

  1. qte5编译dub.json
  2. Win10方便快捷键
  3. educoder——面向对象程序设计java——实验实训——实验二 - 面向对象
  4. Establishing SSL
  5. matlab里newc,Matlab超简单教程
  6. debian 发行代号
  7. Oracle 星期(周末处理)
  8. 解决电脑蓝牙连不上问题
  9. Error(错误)、Exception(异常)之间区别
  10. 图片外链方法大全: 免费的图床! 告别新浪图床 和 CDN