Opencv检测表上的所有通用对象形状(birdview)

2024-05-16 07:56:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我想检测所有种类的物体形状是在一个平的桌子上。桌子可以有灰色、白色或黑色的表面颜色。在

对象可以是任何形状,也可以有不同的颜色。在

什么是解决这个问题的有效方法?在

我试过:

1.)转换成灰度,双边滤波,canny边缘然后使用findContours,也尝试了自适应阈值。在

2.)OpenCV SimpleBlobDetector

原图

Original

轮廓

Contours

Blob检测器

Blob


Tags: 对象方法颜色表面灰度物体形状黑色
3条回答

如果在任何情况下颜色是一个问题,您可以使用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)

结果:

^{pr2}$

enter image description here

cv2.imshow('img2', img2)

enter image description here

如果物体的颜色真的如此不同,那么你可以使用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

选项可以是Watershed Algorithm。在链接的例子中,硬币是用这个算法检测出来的。在

相关问题 更多 >