【问题标题】:How to detect black colour in a video cam using opencv?如何使用opencv检测摄像机中的黑色?
【发布时间】:2019-02-12 06:52:13
【问题描述】:

我需要在实时视频中检测黑色物体。我在互联网上获得了用于检测蓝色物体的代码。所以我根据bgr颜色代码改变了上下hsv值(我不清楚如何将bgr转换为hsv),但它没有检测到视频中的黑色物体。使用蓝色检测的代码是:

import cv2 
import numpy as np  

cap = cv2.VideoCapture(0)  

while(1):        
    _, frame = cap.read()  
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
    lower_red = np.array([110,50,50]) 
    upper_red = np.array([130,255,255]) 
    mask = cv2.inRange(hsv, lower_red, upper_red) 
    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() 
cap.release() 

蓝色的输出是: 原图:

我用于黑色的代码是:`

import cv2 
import numpy as np  

cap = cv2.VideoCapture(0)

while(1):        
    _, frame = cap.read()  
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
    lower_red = np.array([0,0,0]) 
    upper_red = np.array([0,0,0]) 
    mask = cv2.inRange(hsv, lower_red, upper_red) 
    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() 
cap.release() 

结果:

黑色的结果不显示任何内容。我认为问题出在 hsv 转换中,但不确定。并且在检测到的蓝色图像中根本不准确,它会导致噪声。如何实现黑色检测和降噪?

【问题讨论】:

  • 阅读一下关于 HSV 的工作原理en.m.wikipedia.org/wiki/HSL_and_HSV 并意识到黑色将显示为低饱和度(因为它不是鲜艳的颜色)和低value 因为它不亮。然后改变你的范围,看在老天的份上,改变你的变量的名字,给未来的维护工程师一个机会。祝你好运!

标签: python opencv cv2 hsv color-detection


【解决方案1】:

检测黑色的最简单方法是在灰度中进行二进制阈值。黑色像素值始终具有非常低的值,因此在 1 通道图像而不是 3 通道图像中执行此操作会更容易。我会推荐:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 15, 255, cv2.THRESH_BINARY_INV)

更改 15 的值,直到获得合理的结果。较低的值将导致仅保留较暗的像素。如果您想提取像素的位置,您还可以获得轮廓,即

image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

然后将轮廓重新绘制到原始框架上:

frame = cv2.drawContours(frame, contours, -1,(0,0,255),3)

或者,您可能会发现先反转图像更容易,以便尝试提取白色像素。这可能会减少您要提取的像素与掩码像素 (0) 相似的混淆。你可以用 numpy 减法简单地做到这一点,然后将你的阈值设置为一个非常高的值,即:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = 255-gray
ret, thresh = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)
image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
frame = cv2.drawContours(frame, contours, -1,(0,0,255),3)

【讨论】:

    【解决方案2】:
    black= np.array([0, 0, 0], np.uint8)
    
    grayScale= np.array([0, 0, 29], np.uint8)
    

    Valor (29) 取决于您想要多少“亮度”。 This page 是您可以测试颜色范围的地方

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 2015-09-06
      • 2022-10-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多