OpenCV检测表上的所有通用对象形状(BirdView)

时间:2018-07-05 07:11:41

标签: python opencv computer-vision

我想检测平面桌上的所有物体形状。该表可以具有灰色,白色或黑色的表面颜色。

对象可以是任何形状,并且可以具有不同的颜色。

什么是解决此问题的有效方法?

我已经尝试过:

1。)转换为灰度,双边滤波器,精巧边缘,然后使用findContours,也尝试使用自适应阈值。

2。)OpenCV SimpleBlobDetector

原始图片

Original

轮廓

Contours

斑点检测器

Blob

3 个答案:

答案 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)

result

答案 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)

enter image description here

cv2.imshow('img2', img2)

enter image description here