如何使用OpenCV检测视频摄像机中的黑色?

时间:2019-02-12 06:52:14

标签: python opencv cv2 hsv color-detection

我需要检测实时视频中的黑色物体。我在互联网上收到了用于检测蓝色物体的代码。所以我根据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() 

蓝色的输出为: 原始图片: blue

masked blue

blue detection

我用于黑色的代码是:`

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() 

结果: original image

masked black

result

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

2 个答案:

答案 0 :(得分:1)

检测黑色的最简单方法是在灰度中设置二进制阈值。黑色像素值将始终具有非常低的值,因此在1通道图像而不是3通道图像中更容易做到这一点。我建议:

implementation 'com.google.firebase:firebase-core:16.0.7'

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

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

然后使用以下方法将轮廓绘制回原始框架:

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

或者,您可能会发现先反转图像更容易,以便尝试提取白色像素。这样可以减少与要提取的像素(与蒙版像素(0))相似的混淆。您可以使用numpy减法来完成此简单操作,然后将阈值设置为很高的值,即:

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

答案 1 :(得分:1)

black= np.array([0, 0, 0], np.uint8)

grayScale= np.array([0, 0, 29], np.uint8)

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