我需要在实时视频中检测黑色物体。我在互联网上收到了用于检测蓝色物体的代码。所以我根据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转换中,但不确定。并且在检测到的蓝色图像中根本不准确,会导致噪点。如何实现黑色检测并减少噪声?。
最简单的检测黑色方法是对灰度值进行二值化。黑色像素值将始终具有非常低的值,因此在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)
black= np.array([0, 0, 0], np.uint8)
grayScale= np.array([0, 0, 29], np.uint8)
勇气(29)取决于您想要多少“亮度”。This page是您可以测试颜色范围的地方>