gpt4 book ai didi

python - 如何在 python opencv 中完成/关闭轮廓?

转载 作者:太空狗 更新时间:2023-10-30 00:38:28 24 4
gpt4 key购买 nike

我有一个 Pi 相机指向白色背景上的一张卡片。然而,局部阴影似乎阻止了我用于卡片检测的轮廓的闭合,这意味着检测总体上失败了。这是我的意思的屏幕截图:

Screenshot of open contours

您可以看到它尤其在底角周围变得参差不齐。这是我用来实现这一目标的代码:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.blur(gray, (5,5))
gray = cv2.bilateralFilter(gray, 11, 17, 17) #blur. very CPU intensive.
cv2.imshow("Gray map", gray)

edges = cv2.Canny(gray, 30, 120)

cv2.imshow("Edge map", edges)

#find contours in the edged image, keep only the largest
# ones, and initialize our screen contour
# use RETR_EXTERNAL since we know the largest (external) contour will be the card edge.
_, cnts, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:1]
screenCnt = None

# loop over our contours
for c in cnts:
# approximate the contour
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.3 * peri, True)

cv2.drawContours(image, [cnts[0]], -1, (0, 255, 0), 2)

# if our approximated contour has four points, then
# we can assume that we have found our card
if len(approx) == 4:
screenCnt = approx;
break

有没有办法强制它关闭特定的轮廓?如果我进一步模糊图像以平滑不起作用的阴影,因为它只是忽略了那些没有边缘的角落。令人恼火的是它离闭合轮廓只有几个像素,但它从来没有……

编辑:我现在有一个更逼真的设置,其中背景是米色并且有更多的阴影干扰。米色是必要的,因为有些卡片的边框是白色的,所以白色是行不通的。边缘检测主要在阴影所在的左侧失败。

enter image description here

最佳答案

正如我在对您的回答的评论中提到的,“连接”边界线的最简单方法之一是使用形态运算符。在下面的代码中,图像的边缘使用椭圆形状进行了放大。这种技术允许我们合并靠近的线条并填充一些空白区域。您可以在 OpenCV Documentation 中获得有关此主题的更多信息。 .

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(9,9))
dilated = cv2.dilate(image, kernel)
_, cnts, _ = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

在这里你可以看到原始边缘图像、膨胀图像和使用膨胀边缘获得的轮廓(使用原始屏幕截图的裁剪区域获得的图像):

但是,正如您所看到和想象的那样,针对更一般的情况解决此问题更加复杂,并且需要使用其他方法,并且可能比 SO 问题更广泛(或者至少在制定方式上)现在)。

通过查看你的更困难的案例,我可以建议你使用其他图像表示来替换灰度输入图像(例如 HSV 颜色空间的 H channel ),以减少或减弱你对阴影的影响。您还可以探索问题中的一些约束:卡片始终以直线作为边界,并使用能够处理参数形式的方法,例如霍夫线检测器。看看这个问题,它可能会给你一些关于如何改进结果的见解:How to identify square or rectangle with variable lengths and width by using javacv?

备注:双边过滤在计算上非常昂贵,尤其是当您使用树莓派来运行您的应用程序时。我建议投资其他一些替代方案,例如高斯滤波,以减少图片中的噪声量(假设您确实需要这样做)。

关于python - 如何在 python opencv 中完成/关闭轮廓?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43009923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com