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