我是初学使用python的opencv,所以请耐心等待。 我有一个托盘,其中包含不同大小的圆圈,如链接中所示。 https://is.alicdn.com/img/pb/810/421/429/429421810_364.jpg 这不是我的实际图像,但它与上面的图像非常相似。 我必须检测图像中的托盘并找到托盘中所有孔(圆圈)的轮廓。根据拍摄图像的用户,托盘可能会倾斜。 到目前为止,我在图像上使用了高斯模糊和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()
答案 0 :(得分:0)
调整cv2.canny的参数应该可以更容易地检测托盘的边缘。但是,使用cv2.HoughLines可能是检测托盘的更好方法,因为HoughLines不会要求检测完整的边缘。
答案 1 :(得分:0)
对输入执行直方图均衡可以改善图像的对比度。这将改善图像中的边缘检测。
由于图像中的孔看起来很小,因此可能无法进行形态学操作。那将会堵住这些洞,你可能无法找回它们。
Opencv具有霍夫圆变换的实现。这是一个示例的python教程:http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html。使用它可以解决您的问题。
如果这不起作用,发布实际输入图像会很有帮助