【问题标题】:python opencv color trackingpython opencv颜色跟踪
【发布时间】:2021-11-27 10:50:00
【问题描述】:

以下是我用于跟踪白色物体的 Python 代码。
它有效 - 但只有几秒钟,然后整个屏幕变黑,有时它不起作用。
我尝试了蓝色,它有效 - 但白色和绿色给我带来了问题:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

_, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

# define range of white color in HSV
# change it according to your need !
sensitivity = 15
lower_white = np.array([0,0,255-sensitivity])
upper_white = np.array([255,sensitivity,255])

# Threshold the HSV image to get only white colors
mask = cv2.inRange(hsv, lower_white, upper_white)
# Bitwise-AND mask and original image
res = cv2.bitwise_and(frame,frame, mask= mask)

cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)

k = cv2.waitKey(5) & 0xFF
if k == 27:
break

cv2.destroyAllWindows()

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    嗯,首先你应该知道你使用的是什么色彩空间。 只是一个关于 Mat 类型为 CV_8UC3 的 OpenCV 色彩空间的小教程。 (图片来自维基百科)

    HSV

    在 HSV(色相、饱和度、值)色彩空间中,H 给出颜色的主色,S 给出颜色的饱和度,V 给出明度。在 OpenCV 中,范围是不同的。 S,V 在 [0,255] 中,而 H 在 [0, 180] 中。通常 H 在 [0,360] 范围内(整个圆圈),但为了适应一个字节(256 个不同的值),它的值减半。

    在 HSV 空间中更容易分离单一颜色,因为您可以简单地为 H 设置适当的范围,并注意 S 不能太小(几乎是白色),V 不能太小(天会黑)。

    因此,例如,如果您需要几乎 蓝色 的颜色,则需要 H 在值 120 左右(例如在 [110,130] 中),并且 S,V 不能太小(例如在 [100,255 ])。

    白色不是色调(彩虹中没有白色),而是颜色的组合。

    在 HSV 中,您需要取 H 的所有范围(H 在 [0, 180] 中)、非常小的 S 值(例如 [0, 25] 中的 S)和非常高的 V 值(例如 [230 中的 V , 255])。这基本上对应于圆锥的中轴上部。


    所以要让它跟踪 HSV 空间中的白色物体,你需要:

    lower_white = np.array([0, 0, 230])
    upper_white = np.array([180, 25, 255])
    

    或者,因为您定义了一个敏感度值,例如:

    sensitivity = 15
    lower_white = np.array([0, 0, 255-sensitivity])
    upper_white = np.array([180, sensitivity, 255])
    

    对于其他颜色:

    green = 60;
    blue = 120;
    yellow = 30;
    ...
    sensitivity = 15
    
    // Change color with your actual color
    lower_color = np.array([color - sensitivity, 100, 100]) 
    upper_color = np.array([color + sensitivity, 255, 255])
    

    红色 H 值为 0,所以你需要取两个范围并将它们“或”在一起:

    sensitivity = 15
    lower_red_0 = np.array([0, 100, 100]) 
    upper_red_0 = np.array([sensitivity, 255, 255])
    lower_red_1 = np.array([180 - sensitivity, 100, 100]) 
    upper_red_1 = np.array([180, 255, 255])
    
    mask_0 = cv2.inRange(hsv, lower_red_0 , upper_red_0);
    mask_1 = cv2.inRange(hsv, lower_red_1 , upper_red_1 );
    
    mask = cv2.bitwise_or(mask1, mask2)
    

    现在您应该可以跟踪任何颜色了!

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多