如何使用opencv检测摄像机中的黑色?

问题描述 投票:1回答:2

我需要在实时视频中检测黑色物体。我在互联网上收到了用于检测蓝色物体的代码。所以我根据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转换中,但不确定。并且在检测到的蓝色图像中根本不准确,会导致噪点。如何实现黑色检测并减少噪声?。

python opencv cv2 hsv color-detection
2个回答
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)

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.