首页 > 解决方案 > 多色对象的 HSV 空间

问题描述

我想检测下面的这个门,最好是整个门。我已经用轨迹栏脚本玩了几个小时,但我只是没有找到合适的色彩空间。我发现其他线程只是跟踪黄色,甚至没有工作。这是我的代码:

def track():
    cap = cv2.VideoCapture('../files/sub/gate_mission1.mp4')
    while True:
        _, frame = cap.read()
        cv2.imshow('img', frame)
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

        lower = np.array([20, 93, 0])
        upper = np.array([45, 255, 255])

        mask = cv2.inRange(hsv, lower, upper)
        contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(frame, contours, -1, (0, 255, 0), 2)

也许有一种方法可以删除所有的蓝色/绿色,我也不确定?我在这里有什么选择?

在此处输入图像描述

标签: pythonopencvcomputer-vision

解决方案


通过在 Python/OpenCV 的 LAB 颜色空间中设置阈值,这似乎对我有用。根据 Wikipedia 在https://en.wikipedia.org/wiki/CIELAB_color_space “a* 轴相对于绿色-红色的对手颜色,负值指向绿色,正值指向红色。” 所以我们应该为你的绿色和红色得到相当好的分离。

输入:

在此处输入图像描述

import cv2
import numpy as np

# load images
img = cv2.imread('gate.jpg')

# convert to LAB
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)

# set black ranges
lower = (130,105,100)
upper = (170,170,160)

# threshold on black
result = cv2.inRange(lab, lower, upper)

# save output
cv2.imwrite('gate_thresh.jpg', result)

# display results
cv2.imshow('thresh',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

阈值图像

在此处输入图像描述


推荐阅读