0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用OpenCV中的简单计算机视觉技术创建我们自己的“隐形衣”

gVTR_Unf 来源:AI算法与图像处理 作者:AI_study 2020-09-07 16:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

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

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

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

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

它的原理是什么?

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

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

其基本思想如下:

1. 捕获并存储背景帧。

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

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

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

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

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

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

C++

//CreateaVideoCaptureobjectandopentheinputfile// If the input is the web camera, pass 0 instead of the video file nameVideoCapture cap("video4.mp4");// Check if camera opened successfullyif(!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=0 for 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-framecap >> frame; // Laterally invert the image / flip the imageflip(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 maskmask1 = mask1 + mask2;

Python

# Capturing the live frameret, img = cap.read() # Laterally invert the image / flip the imageimg = np.flip(imgaxis=1) # converting from BGR to HSV color spacehsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # Range for lower redlower_red = np.array([0,120,70])upper_red = np.array([10,255,255])mask1 = cv2.inRange(hsv, lower_red, upper_red) # Range for upper rangelower_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 colormask1 = 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 framebitwise_not(mask1,mask2);Mat res1, res2, final_output; // Segmenting the cloth out of the frame using bitwise and with the inverted maskbitwise_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 framemask2 = cv2.bitwise_not(mask1) #Segmenting the cloth out of the frame using bitwise and with the inverted maskres1 = cv2.bitwise_and(img,img,mask=mask2)

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

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

C++

// creating image showing static background frame pixels only for the masked regionbitwise_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 regionres2 = cv2.bitwise_and(background, background, mask = mask1) #Generating the final outputfinal_output = cv2.addWeighted(res1,1,res2,1,0)imshow("magic",final_output)cv2.waitKey(1)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像
    +关注

    关注

    2

    文章

    1095

    浏览量

    42154
  • 计算机视觉
    +关注

    关注

    9

    文章

    1714

    浏览量

    47450
  • OpenCV
    +关注

    关注

    33

    文章

    651

    浏览量

    44409

原文标题:OpenCV黑魔法之隐身衣

文章出处:【微信号:Unfinished_coder,微信公众号:机器视觉CV】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用代理式AI激活传统计算机视觉系统的三种方法

    当前的计算机视觉系统擅长于识别物理空间与流程的事件,却难以诠释场景细节及其意义,也无法推理后续可能发生的情况。
    的头像 发表于 12-01 09:44 327次阅读

    STM32计算机视觉开发套件:B-CAMS-IMX摄像头模块技术解析

    STMicroelectronics用于 STM32开发板的B-CAMS-IMX摄像头模块提供强大的硬件集,可处理多种计算机视觉场景和用例。该模块具有高分辨率500万像素IMX335LQN
    的头像 发表于 10-20 09:46 710次阅读
    STM32<b class='flag-5'>计算机</b><b class='flag-5'>视觉</b>开发套件:B-CAMS-IMX摄像头模块<b class='flag-5'>技术</b>解析

    易控智驾荣获计算机视觉顶会CVPR 2025认可

    近日,2025年国际计算机视觉与模式识别顶级会议(IEEE/CVF Conference on Computer Vision and Pattern Recognition,CVPR 2025)在美国田纳西州纳什维尔召开。
    的头像 发表于 07-29 16:54 976次阅读

    工业计算机的重要性

    工业计算机对某些行业至关重要。我们将在下面详细解释这些行业的工业计算机应用。1.制造与工业自动化工业级计算机非常适合制造工厂,特别是那些想
    的头像 发表于 07-28 16:07 398次阅读
    工业<b class='flag-5'>计算机</b>的重要性

    自动化计算机经过加固后有什么好处?

    我们讨论一下部署坚固的自动化计算机的一些好处。1.温度范围宽自动化计算机经过工程设计,配备了支持宽温度范围的组件,使自动化计算解决方案能够在各种不同的极端环境
    的头像 发表于 07-21 16:44 419次阅读
    自动化<b class='flag-5'>计算机</b>经过加固后有什么好处?

    自动化计算机的功能与用途

    工业自动化是指利用自动化计算机来控制工业环境的流程、机器人和机械,以制造产品或其部件。工业自动化的目的是提高生产率、增加灵活性,并提升制造过程的质量。工业自动化在汽车制造中体现得最为明显,其中许多
    的头像 发表于 07-15 16:32 527次阅读
    自动化<b class='flag-5'>计算机</b>的功能与用途

    工业计算机与商用计算机的区别有哪些

    工业计算机是一种专为工厂和工业环境设计的计算系统,具有高可靠性和稳定性,能够应对恶劣环境下的自动化、制造和机器人操作。其特点包括无风扇散热技术、无电缆连接和防尘防水设计,使其在各种工业自动化场景
    的头像 发表于 07-10 16:36 516次阅读
    工业<b class='flag-5'>计算机</b>与商用<b class='flag-5'>计算机</b>的区别有哪些

    利用边缘计算和工业计算机实现智能视频分析

    IVA的好处、实际部署应用程序以及工业计算机如何实现这些解决方案。一、什么是智能视频分析(IVA)?智能视频分析(IVA)集成了复杂的计算机视觉,通常与卷积神经网
    的头像 发表于 05-16 14:37 631次阅读
    利用边缘<b class='flag-5'>计算</b>和工业<b class='flag-5'>计算机</b>实现智能视频分析

    Arm KleidiCV与OpenCV集成助力移动端计算机视觉性能优化

    生成式及多模态人工智能 (AI) 工作负载的广泛增长,推动了对计算机视觉 (CV) 技术日益高涨的需求。此类技术能够解释并分析源自现实世界的视觉
    的头像 发表于 02-24 10:15 875次阅读

    AR和VR计算机视觉

    ):计算机视觉引领混合现实体验增强现实(AR)和虚拟现实(VR)正在彻底改变我们与外部世界的互动方式。即便是在引人入胜的沉浸式
    的头像 发表于 02-08 14:29 2124次阅读
    AR和VR<b class='flag-5'>中</b>的<b class='flag-5'>计算机</b><b class='flag-5'>视觉</b>

    黄仁勋:我们正重新发明计算机

    近日,英伟达在北京举办了答谢迎春会,英伟达创始人兼CEO黄仁勋亲临现场并发表了致辞。在致辞,他透露了一个令人振奋的消息:“我们正处于一个新时代的开端,一个重新发明计算机的时代。” 黄仁勋表示
    的头像 发表于 01-21 10:08 675次阅读

    云端超级计算机使用教程

    云端超级计算机是一种基于云计算的高性能计算服务,它将大量计算资源和存储资源集中在一起,通过网络向用户提供按需的计算服务。下面,AI部落小编为
    的头像 发表于 12-17 10:19 942次阅读

    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV

    视觉领域最有力的研究工具。在深度学习我们会经常接触到两个名称,图像处理和计算机视觉,它们之间有什么区别呢? 图像处理 (Image Pr
    发表于 12-14 09:31

    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV

    力的研究工具。在深度学习我们会经常接触到两个名称,图像处理和计算机视觉,它们之间有什么区别呢?图像处理(ImageProcessing)目的:图像处理主要集中在
    的头像 发表于 12-14 09:10 1260次阅读
    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署<b class='flag-5'>OpenCV</b>

    【AI实战项目】基于OpenCV的“颜色识别项目”完整操作过程

    OpenCV是一个广受欢迎且极为流行的计算机视觉库,它因其强大的功能、灵活性和开源特性而在开发者和研究者备受青睐。学习OpenCV主要就是
    的头像 发表于 12-09 16:42 1893次阅读
    【AI实战项目】基于<b class='flag-5'>OpenCV</b>的“颜色识别项目”完整操作过程