我想检测平面桌上的所有物体形状。该表可以具有灰色,白色或黑色的表面颜色。
对象可以是任何形状,并且可以具有不同的颜色。
什么是解决此问题的有效方法?
我已经尝试过:
1。)转换为灰度,双边滤波器,精巧边缘,然后使用findContours,也尝试使用自适应阈值。
2。)OpenCV SimpleBlobDetector
原始图片
轮廓
斑点检测器
答案 0 :(得分:1)
一个选项可以是Watershed Algorithm。在链接的示例中,使用此算法检测硬币。
答案 1 :(得分:1)
如果对象的颜色实际上是如此不同,则可以使用HSV颜色空间的色相通道。
image = cv2.imread('image.png',cv2.IMREAD_UNCHANGED)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hsv = cv2.split(hsv)
gray = hsv[0]
ret,binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)
contours = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
cv2.drawContours(image, contours, -1, (0,0,255),2)
答案 2 :(得分:1)
无论如何颜色都是问题,您可以使用adaptive threshold在桌子上找到对象的边缘。
代码:
img = cv2.imread(r'C:\Users\Jackson\Desktop\table.png', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 5)
ret,th1 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
adaptive_threshold = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2)
img2 = img.copy()
_, contours, _ = cv2.findContours(cv2.threshold(th3, 0, 255, cv2.THRESH_BINARY_INV)[1], cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img2, contours, -1, (0, 255, 0), 2)
结果:
cv2.imshow('adaptive_threshold', adaptive_threshold)
cv2.imshow('img2', img2)