基于opencvpython的游戏板矩形检测
我是使用python的opencv新手,请耐心听我说。 我有一个托盘,上面有不同大小的圆圈,就像链接中的一样。 这不是我的真实图像,但它与上面的非常相似。 我必须检测图像中的托盘,并找到托盘中所有孔(圆)的轮廓。托盘可能会倾斜,具体取决于拍摄图像的用户。 到目前为止,我对图像使用了高斯模糊和canny边缘检测,并填补了canny边缘检测的空白。这是Canny边缘检测后的图像 这是经过形态学处理的图像。 然后我使用findcontours并试图找到具有4个顶点的最大轮廓,理想情况下,这就是托盘本身。 轮廓检测只能识别左侧垂直边界和顶部水平边界。它无法识别托盘的4个边缘 这是我目前的代码:基于opencvpython的游戏板矩形检测,python,opencv,canny-operator,Python,Opencv,Canny Operator,我是使用python的opencv新手,请耐心听我说。 我有一个托盘,上面有不同大小的圆圈,就像链接中的一样。 这不是我的真实图像,但它与上面的非常相似。 我必须检测图像中的托盘,并找到托盘中所有孔(圆)的轮廓。托盘可能会倾斜,具体取决于拍摄图像的用户。 到目前为止,我对图像使用了高斯模糊和canny边缘检测,并填补了canny边缘检测的空白。这是Canny边缘检测后的图像 这是经过形态学处理的图像。 然后我使用findcontours并试图找到具有4个顶点的最大轮廓,理想情况下,这就是托盘本身
import numpy as np
import cv2
import matplotlib.pyplot as plt
image = cv2.imread("img.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.GaussianBlur(image, (3, 3), 0)
image_canny = cv2.Canny(image, 30, 200)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
gaps_closed = cv2.morphologyEx(image_canny, cv2.MORPH_CLOSE, kernel)
_, contours, _= cv2.findContours(gaps_closed.copy(), cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key = cv2.contourArea, reverse = True)
[:5]
Cnt = None
for c in contours:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.04 * peri, True)
if len(approx) == 4:
Cnt = approx
break
cv2.drawContours(image, [Cnt], -1, (0, 255, 0), 4)
plt.imshow(image)
plt.show()
调整cv2.canny的参数应使检测托盘边缘更容易。但是,使用cv2.HoughLines可能是检测托盘的更好方法,因为HoughLines不要求检测到完整的边缘。调整cv2.canny的参数应使检测托盘边缘更容易。但是,使用cv2.HoughLines可能是检测托盘的更好方法,因为HoughLines不需要检测到完整的边缘。对输入执行直方图均衡化可以提高图像的对比度。这将改进图像中的边缘检测 由于图像中的孔看起来很小,因此形态学操作可能不是一种可行的方法。那会把洞吸干,你可能无法找回它们 Opencv具有用于Hough圆变换的实现。下面是一个示例的python教程:。使用它可以解决你的问题
如果这不起作用,发布实际输入图像会很有帮助对输入执行直方图均衡化会提高图像的对比度。这将改进图像中的边缘检测 由于图像中的孔看起来很小,因此形态学操作可能不是一种可行的方法。那会把洞吸干,你可能无法找回它们 Opencv具有用于Hough圆变换的实现。下面是一个示例的python教程:。使用它可以解决你的问题
如果这不起作用,发布您的实际输入图像会很有帮助在Canny和形态学操作后是否可以附加当前输出?@ZdaR:添加了图片。在Canny和形态学操作后是否可以附加当前输出?@ZdaR:添加了图片。