我正在尝试检测扑克牌,并使用python opencv对它们进行转换,以获得扑克牌的鸟瞰图。我的代码可以很好地处理简单的案例,但我没有停留在简单的案例上,而是想尝试更复杂的案例。我在为卡片寻找正确的轮廓时遇到问题。下面是我试图检测卡片并绘制轮廓的附加图像:
我的代码:
path1 = "F:\\ComputerVisionPrograms\\images\\cards4.jpeg"
g = cv2.imread(path1,0)
img = cv2.imread(path1)
edge = cv2.Canny(g,50,200)
p,c,h = cv2.findContours(edge, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
rect = []
for i in c:
p = cv2.arcLength(i, True)
ap = cv2.approxPolyDP(i, 0.02 * p, True)
if len(ap)==4:
rect.append(i)
cv2.drawContours(img,rect, -1, (0, 255, 0), 3)
plt.imshow(img)
plt.show()
结果:
这不是我想要的,我只想选择矩形卡片,但由于它们相互遮挡,我没有得到我所期望的。我认为我需要应用形态学技巧或其他操作来分离它们,或者使边缘更加突出,或者可能是其他东西。如果你能分享你解决这个问题的方法,我将不胜感激
其他研究员还要求提供几个例子:
有很多方法可以在图像中找到重叠的对象。你可以肯定的是,你的卡片都是长方形的,大部分是白色的,大小都一样。你的变量是亮度,角度,可能是一些透视失真。如果您想要一个健壮的解决方案,您需要解决所有这些问题
我建议使用Hough变换来查找卡片边缘。首先,运行常规的边缘检测。比你需要清理的结果,因为许多短边将属于“脸”卡。我建议结合使用扩张(11)——>;侵蚀(15)——>;扩张(5)。这种组合将填补“脸”卡中的所有空白,然后它会“缩小”斑点,在去除原始边缘的过程中,最终会重新生长并与原始脸图片重叠一点。然后将其从原始图像中删除
现在您有了一个几乎具有所有相关边缘的图像。使用Hough变换查找它们。它会给你一套台词。过滤一点后,你们可以将这些边和卡片的矩形相匹配
这将为您提供以下信息:
我在检测你的形状里面的白色矩形。最终结果是检测到的图像和边界框坐标。脚本还没有完成。在接下来的几天里,我会继续努力
另一种获得更好结果的方法是去掉边缘检测/线条检测部分(我个人更喜欢),在图像预处理后找到轮廓
以下是我的代码和结果:
结果-
通过这个,我们得到了图像中卡片的边界。要检测和分离每一张卡,需要一个更复杂的算法,或者可以使用深度学习模型
相关问题 更多 >
编程相关推荐