使用 OpenCV 进行实时对象颜色检测

在本文中,我们将讨论如何使用 python 和 OpenCV 检测单色对象。单色是指单一波长的光。我们将使用使用网络摄像头捕获的视频作为输入,并尝试检测单一颜色的对象,尤其是蓝色。但是,如果您正确设置范围,您可以检测到任何颜色,我们将在稍后讨论。 

为此,强烈建议将颜色从 RGB 格式转换为 HSV。HSV 代表色相、饱和度和值。色调表示颜色本身,从技术上讲,它表示 HSV 颜色模型中的角度。 

让我们先了解 HSV 颜色模型。想象一个圆柱体,它有一个高度、一个半径和一个曲面面积。以半径的初始位置为参考,将半径逆时针移动角度θ,即θ为半径的当前位置与其初始位置的夹角。如果 θ 为 0 度,则表示红色,如果 θ 为 120 度,则表示绿色,依此类推。半径的长度是颜色的饱和度,高度表示 HSV 中的值或 V。

主要思想是将输入的 RGB 图像(在 OpenCV 的情况下为 BGR,因为这就是该模块中图像的格式)转换为 HSV 格式,这将使我们更容易将特定颜色从帧中屏蔽掉。也就是说,所提供的 HSV 范围内的任何颜色都将被赋予 255 的值,而其他颜色将简单地为 0,因此,具有指定范围内颜色的每个对象都将变为白色,留下图像的其余部分,即背景黑色. 

要显示颜色,我们需要按位显示带有掩码的当前帧。为此,有一个名为 bitwise_and() 的内置函数

句法: 
result = cv2.bitwise_and(pic1, pic2, mask)

其中 pic1 和 pic 2 是输入图像,另一个是掩码。可以将蒙版视为应用于图像的剪切形状,因此只有剪切部分可见。 

执行:

首先,使用以下两个代码导入所需模块后创建一个 OpenCV 视频捕获对象:

import cv2
import numpy as np

然后开始无限循环,读取网络摄像头读取的每一帧。使用cv2.cvtColor()函数将每一帧从 BGR 格式转换为 HSV 格式,它将帧作为第一个输入,颜色转换的类型作为第二个输入。 

语法: 
cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

之后指定蓝色(或您喜欢的任何颜色)的下限和上限。通过创建两个 NumPy 数组,所需的下限和上限为 [H, S, V]。这两个 NumPy 数组将用作阈值函数(即cv2.inRange()函数)中的参数。它需要三个参数,图像源、下限和上限。

语法: 
cv2.inRange(source, lower_limit, upper_limit)

cv2.inRange()函数将范围内的所有值设置为 255,其余设置为 0。该函数的输出将是我们的掩码。最后在前面提到的bitwise_and函数中传递这个掩码将产生所需的结果。输出如下。

代码:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while 1:
	ret,frame =cap.read()
	# ret will return a true value if the frame exists otherwise False
	into_hsv =cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
	# changing the color format from BGr to HSV
	# This will be used to create the mask
	L_limit=np.array([98,50,50]) # setting the blue lower limit
	U_limit=np.array([139,255,255]) # setting the blue upper limit
		

	b_mask=cv2.inRange(into_hsv,L_limit,U_limit)
	# creating the mask using inRange() function
	# this will produce an image where the color of the objects
	# falling in the range will turn white and rest will be black
	blue=cv2.bitwise_and(frame,frame,mask=b_mask)
	# this will give the color to mask.
	cv2.imshow('Original',frame) # to display the original frame
	cv2.imshow('Blue Detector',blue) # to display the blue object output

	if cv2.waitKey(1)==27:
		break
	# this function will be triggered when the ESC key is pressed
	# and the while loop will terminate and so will the program
cap.release()

cv2.destroyAllWindows()

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。在C++中使用OpenCV进行小球颜色识别可以通过以下步骤实现: 1. 导入OpenCV库:在C++代码中,首先需要导入OpenCV库,可以使用`#include <opencv2/opencv.hpp>`语句来实现。 2. 读取图像:使用`cv::imread()`函数读取待处理的图像文件,并将其存储在一个`cv::Mat`对象中。 3. 转换颜色空间:将读取的图像从默认的BGR颜色空间转换为HSV颜色空间,因为HSV颜色空间对颜色的描述更加直观。可以使用`cv::cvtColor()`函数来实现。 4. 设定颜色范围:根据小球的颜色特征,设定一个颜色范围,用于在图像中提取该颜色的区域。可以使用`cv::inRange()`函数来实现。 5. 进行形态学操作(可选):根据实际情况,可以对提取到的颜色区域进行形态学操作,如腐蚀和膨胀,以去除噪声或填充空洞。可以使用`cv::erode()`和`cv::dilate()`函数来实现。 6. 寻找轮廓:使用`cv::findContours()`函数在处理后的图像中寻找轮廓。 7. 过滤轮廓:根据实际需求,可以对找到的轮廓进行一些过滤操作,如面积过滤、长宽比过滤等。 8. 绘制结果:使用`cv::drawContours()`函数将找到的轮廓绘制在原始图像上,以便观察识别结果。 下面是一些相关问题: 1. OpenCV是什么? 2. 如何在C++中使用OpenCV? 3. 什么是颜色空间转换? 4. 什么是HSV颜色空间? 5. 形态学操作在图像处理中有什么作用? 6. 如何使用OpenCV进行轮廓检测? 7. 如何对找到的轮廓进行过滤操作? 8. 如何在图像上绘制轮廓?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值