Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于opencvpython的游戏板矩形检测_Python_Opencv_Canny Operator - Fatal编程技术网

基于opencvpython的游戏板矩形检测

基于opencvpython的游戏板矩形检测,python,opencv,canny-operator,Python,Opencv,Canny Operator,我是使用python的opencv新手,请耐心听我说。 我有一个托盘,上面有不同大小的圆圈,就像链接中的一样。 这不是我的真实图像,但它与上面的非常相似。 我必须检测图像中的托盘,并找到托盘中所有孔(圆)的轮廓。托盘可能会倾斜,具体取决于拍摄图像的用户。 到目前为止,我对图像使用了高斯模糊和canny边缘检测,并填补了canny边缘检测的空白。这是Canny边缘检测后的图像 这是经过形态学处理的图像。 然后我使用findcontours并试图找到具有4个顶点的最大轮廓,理想情况下,这就是托盘本身

我是使用python的opencv新手,请耐心听我说。 我有一个托盘,上面有不同大小的圆圈,就像链接中的一样。 这不是我的真实图像,但它与上面的非常相似。 我必须检测图像中的托盘,并找到托盘中所有孔(圆)的轮廓。托盘可能会倾斜,具体取决于拍摄图像的用户。 到目前为止,我对图像使用了高斯模糊和canny边缘检测,并填补了canny边缘检测的空白。这是Canny边缘检测后的图像 这是经过形态学处理的图像。 然后我使用findcontours并试图找到具有4个顶点的最大轮廓,理想情况下,这就是托盘本身。 轮廓检测只能识别左侧垂直边界和顶部水平边界。它无法识别托盘的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:添加了图片。