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

Python Opencv检测表上的所有通用对象形状(birdview),python,opencv,computer-vision,Python,Opencv,Computer Vision,我想检测平桌上的各种物体形状。桌子的表面颜色可以是灰色、白色或黑色 对象可以是任何形状,也可以有不同的颜色 解决这个问题的有效方法是什么 我试过: 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,cv

我想检测平桌上的各种物体形状。桌子的表面颜色可以是灰色、白色或黑色

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

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

我试过:

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)
1.)转换为灰度、双边过滤器、canny边缘,然后使用FindContentours,也尝试使用自适应阈值

2.)OpenCV SimpleBlobDetector

原始图片

等高线

水滴探测器


一个选项可以是。在链接示例中,使用此算法检测硬币

如果对象的颜色变化很大,则可以使用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)

如果在任何情况下,颜色是一个问题,您可以使用找到表上对象的边缘

代码:

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)
结果:

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)