繁体   English   中英

CV2 Find Contours 检测地板而不是我的目标

[英]CV2 Find Contours detecting the floor and not my target

我正在尝试检测地板上的黑色胶带,但是每当我尝试增加阈值以阻止它检测到地面时,它所做的就是停止检测胶带。 在此处输入图像描述

from cv2 import cv2
import numpy as np

img = cv2.imread('tape4.jpeg', cv2.IMREAD_UNCHANGED)

#convert img to grey
img_grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#set a thresh
thresh = 100
#get threshold image
ret,thresh_img = cv2.threshold(img_grey, thresh, 255, cv2.THRESH_BINARY)
#find contours
contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

#create an empty image for contours
img_contours = np.zeros(img.shape)
# draw the contours on the empty image
cv2.drawContours(img_contours, contours, -1, (0,255,0), 3)
#save image
cv2.imwrite('contours.png',img_contours) 

您可以使用使用cv2.THRESH_BINARY_INV而不是cv2.THRESH_BINARY来查找低于thresh值的像素而不是高于阈值的像素。

您检测地板的原因是cv2.threshold标记(具有255值),高于thresh的像素。
您想要标记低于thresh的暗像素。
您可以计算: thresh_img = 255 - thresh_img ,或使用cv2.THRESH_BINARY_INV (结果相同)。

我还建议使用关闭形态学操作来消除混乱。

查找磁带的代码:

import cv2
import numpy as np

img = cv2.imread('tape4.jpeg', cv2.IMREAD_UNCHANGED)

#convert img to grey
img_grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#set a thresh
thresh = 20 # Set thresh to very low value (the tape is almost black).
#get threshold image
# Use cv2.THRESH_BINARY_INV instead of cv2.THRESH_BINARY for finding pixels below thresh instead of pixels above thresh
ret,thresh_img = cv2.threshold(img_grey, thresh, 255, cv2.THRESH_BINARY_INV)

# Apply closing morphological operation
thresh_img = cv2.morphologyEx(thresh_img, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (21,21)));

#find contours
contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

#create an empty image for contours
img_contours = np.zeros(img.shape)
# draw the contours on the empty image
cv2.drawContours(img_contours, contours, -1, (0,255,0), 3)
#save image
cv2.imwrite('contours.png',img_contours) 

结果:
在此处输入图像描述

为了找到磁带,您可以在 contours 中查找最大的contours

# Get contour with maximum area
c = max(contours, key=cv2.contourArea)
img_contours = np.zeros(img.shape)
cv2.drawContours(img_contours, [c], -1, (0,255,0), 3)

结果:
在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM