2024-05-16 07:56:34 发布
网友
我想检测所有种类的物体形状是在一个平的桌子上。桌子可以有灰色、白色或黑色的表面颜色。在
对象可以是任何形状,也可以有不同的颜色。在
什么是解决这个问题的有效方法?在
我试过:
1.)转换成灰度,双边滤波,canny边缘然后使用findContours,也尝试了自适应阈值。在
2.)OpenCV SimpleBlobDetector
原图
轮廓
Blob检测器
如果在任何情况下颜色是一个问题,您可以使用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('img2', img2)
如果物体的颜色真的如此不同,那么你可以使用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)
选项可以是Watershed Algorithm。在链接的例子中,硬币是用这个算法检测出来的。在
如果在任何情况下颜色是一个问题,您可以使用adaptive threshold在表上找到对象的边缘。在
代码:
结果:
^{pr2}$如果物体的颜色真的如此不同,那么你可以使用HSV颜色空间的色调通道。在
选项可以是Watershed Algorithm。在链接的例子中,硬币是用这个算法检测出来的。在
相关问题 更多 >
编程相关推荐