filter_img
的作用是从视频帧(或图像)中根据指定的颜色范围过滤出特定颜色的区域。以下是该方法的详细步骤和解释:
输入参数:
self
:表示类的实例,通常在类的其他方法中使用。frame
:输入的视频帧(或图像),是一个像素值的二维数组。color
:可以是指定颜色范围的列表,或者是某种特定的颜色值。
颜色空间转换:
b,g,r = cv2.split(frame)
:将输入的 BGR 格式的图像frame
分割为独立的蓝色、绿色和红色通道。frame_bgr = cv2.merge((r,g,b))
:将分割后的 RGB 通道重新合并,因为 OpenCV 的许多颜色空间转换函数期望输入格式为 BGR。
颜色空间从 BGR 转换到 HSV:
hsv = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2HSV)
:将图像的颜色空间从 BGR 转换为 HSV。HSV 颜色空间对颜色的变化更加敏感,适合用于颜色过滤。
定义颜色范围:
- 如果
color
是一个列表,它应该包含两个元素:color[0]
是颜色的下限,color[1]
是颜色的上限。 - 如果
color
不是一个列表,那么它应该是一个特定的颜色值,此时方法get_color_mask(color)
被用来自动确定该颜色的上限和下限。这个get_color_mask
方法没有在代码中给出,可能是一个自定义函数,用于根据输入的颜色值生成对应的颜色掩码。
- 如果
创建颜色掩码:
mask = cv2.inRange(hsv, color_lower, color_upper)
:使用color_lower
和color_upper
定义的颜色范围,在 HSV 颜色空间中创建一个掩码。这个掩码将图像中不属于指定颜色范围的像素设置为 0,属于指定颜色范围的像素设置为 255。
应用掩码并返回结果:
img_mask = cv2.bitwise_and(frame, frame, mask=mask)
:使用bitwise_and
函数将原始图像frame
与掩码mask
进行按位与操作,结果是一个只包含指定颜色范围的图像img_mask
。
返回值:
- 方法返回
img_mask
,这是一个过滤后的图像,其中只有指定颜色范围内的像素可见,其他像素被设置为黑色。
- 方法返回
使用场景:
这个方法可以用于各种需要颜色过滤的场景,比如在交通监控中过滤出特定颜色的车辆,在农业自动化中过滤出成熟的果实等。通过调整 color
参数,可以针对不同的颜色进行过滤。
def filter_img(self,frame,color):
b,g,r = cv2.split(frame)
frame_bgr = cv2.merge((r,g,b))
hsv = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2HSV)
if isinstance(color, list):
color_lower = np.array(color[0])
color_upper = np.array(color[1])
else:
color_upper, color_lower = get_color_mask(color)
mask = cv2.inRange(hsv, color_lower, color_upper)
img_mask = cv2.bitwise_and(frame, frame, mask=mask)
return img_mask