对于一个我试图匹配拼图游戏的项目,我写了一些代码来确定拼图两边的凹痕(向内和向外)。我添加了两个示例图像来显示结果。
可以很好地检测到所有缩进,但是其准确性并不总是如预期的那样。我认为这是由于 cv2.findContours()导致的,该点只能提供有限的点数。我提供了cv2.findContours()的代码。
imshape = l.getImageShape(image)
ret, thresh = cv2.threshold(imshape, 0, 254, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
我选择仅将外部线与RETR_EXTERNAL一起使用,因为这些线是唯一需要的轮廓。我还决定使用CHAIN_APPROX_NONE来保存每一个点,即使我实际上不需要太多有关侧面笔直部分的信息。但是,CHAIN_APPROX_SIMPLE还删除了关键(缩进)部分的某些点,从而进一步降低了准确性。
第一个函数getImageShape只是以类似于脱粒的方式获取形状,但我发现预先使用此方法可获得更好的结果,而不是像以前那样仅将源图像作为cv2.threshold函数的输入参数代码。
def getImageShape(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, ksize=5)
thresh = cv2.threshold(gray, 0, 254, cv2.THRESH_BINARY)[1]
thresh = cv2.blur(thresh, ksize=(3, 3))
return thresh
由于准确性不佳(难题一侧的宽度/高度大约有4%的误差),仅根据其缩进位置将两侧相互匹配会导致多种“可能”的解决方案。我希望有一种方法可以增加cv2.getContours返回的点数,但是在openCV文档中找不到任何有关该点的信息。
如果这是不可能的,那么我将不得不添加一些图像连续性检测算法(但这将使其无法仅通过形状匹配块)。
谢谢!