我正在尝试从 USB 相机图像中检测黄色。我正在使用黄色蒙版来过滤对象并在找到的轮廓周围绘制矩形。 如果我保存从 USB 摄像头获得的帧,然后应用边缘检测。它工作正常。 但是当我直接对视频捕获获得的帧应用边缘检测时,我没有得到好的结果。我得到了许多小轮廓。 谁能指出错误吗?
当我读取保存为 png 的相机帧时,下面提供的代码给出了良好的结果。
# Convert the image to HSV color space
image=cv2.imread('/content/drive/MyDrive/droplets.png')
hsv = cv2.cvtColor(Frame, cv2.COLOR_RGB2HSV)
# Define the range of yellow color in HSV
lower_yellow = np.array([0,38, 57], dtype="uint8")
upper_yellow = np.array([70, 255, 255], dtype="uint8")
# Threshold the image to get only yellow colors
mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
#cv2.imshow('orginal',mask)
# Find contours in the binary image
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
QttyOfContours = QttyOfContours+1
#print('Number_of_contours',QttyOfContours)
#draw an rectangle "around" the object
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(Frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
#find object's centroid
CoordXCentroid = (x+x+w)/2
CoordYCentroid = (y+y+h)/2
ObjectCentroid = (CoordXCentroid,CoordYCentroid)
#print(CoordXCentroid,CoordYCentroid)
cv2.circle(Frame,(int(CoordXCentroid),int(CoordYCentroid)), 1, (0, 0, 0), 5)
cv2.drawContours(Frame, contours, -1, (0, 255, 0), 2)
#cv2.startWindowThread()
cv2_imshow(Frame)
cv2.waitKey(100);
相同的代码在我使用时给出了不好的结果
Cap=cv2.Videocapture(1,cv2.CAP_DSHOW)
ret,frame=cap_read()
我认为您的代码中没有错误。问题在于进入算法的数据 - MPEG 视频捕获帧有些噪音。
视频捕获帧可能默认为有损 MPEG 编码,因此捕获的视频帧将具有 JPG 伪像,这些伪像在包含锐边过渡的 8x8 块中看起来很像烟雾。
量化误差使得 JPEG 图像中锐利边缘附近的高频噪声相当严重。人眼根本看不到它,但边缘检测算法可以!
为了使其在应用阈值和边缘检测时表现更好,您的选项是:
您可能需要尝试找到一种折衷的 LP 滤波器,该滤波器仍然允许良好的边缘检测,同时充分抑制 JPEG 伪影。您可能需要使用具有 5 项的内核才能充分抑制噪声。不过,应用于水平和垂直方向的一维内核应该足够好(并且相对较快)。