我使用轮廓检测进行矩形检测,并在调整透视投影之前使用OpenCv应用多边形以获取矩形的位置.它工作得很好.但是我小组中的一些人建议转换Hough.我想知道使用Hough变换进行矩形检测是否有任何优势.
更新:我尝试了两种方法.在我的例子中,两种方法在Canny边缘检测后都能正常工作.但是由于霍夫变换产生线,我们必须假设几行,例如线的长度和线的可连接性,并且应该进行额外的计算,例如搜索连接的线并从连接的线找到角点.就个人而言,我更喜欢轮廓法,因为它的概念更简单.使用该方法,您只需搜索可以使用具有4个角的闭合和凸多边形近似的轮廓,并调整多边形的透视投影.就是这样.
另一个关于检测图片中的卡片。我已经成功地隔离了图片中的卡片,我有一个很近的凸包,从这里我被卡住了。
对于上下文/约束,目标:
我使用的方法:
第1、3、6步主要是去除噪声和小伪影。
所以我几乎卡在第 9 步。我试过一个示例图片:
在调试图片上:
(结果图片是从minAreaRect中提取的)
所以轮廓是可以接受的,我可以通过调整 canny 或第一次模糊的参数来做得更好。但现在这是可以接受的,现在的问题是,我怎样才能得到将形成“minarea 四边形”的 4 个点。如您所见, minAreaRect 给出了一个不完美的矩形,并且 approxPolyDp 丢失了太多的卡片。
有什么线索可以解决这个问题吗?我尝试在使用 approxPolyDp(我使用arcLength*0.1)时使用 epsilon 值,但没有。
这种方法的另一个问题是在 canny 期间丢失了一个角(参见示例),它将不起作用(除非使用 minAreaRect 时)。但这可能可以在之前(通过更好的预处理)或之后解决(因为我们知道宽/高比)。
不是在这里要求代码,只是想知道如何解决这个问题,
谢谢!
编辑:Yves Daoust 的解决方案:
结果:
编辑 2:使用 Hough 变换(而不是 …
我正在尝试检测照片是否代表填充了数据的预定义公式模板。
我是图像处理和 OpenCV 的新手,但我的第一次尝试是使用 FlannBasedMatcher 并比较检测到的关键点的数量。
有一个更好的方法吗?
import numpy as np
import cv2
from matplotlib import pyplot as plt
MIN_MATCH_COUNT = 10
img1 = cv2.imread('filled-form.jpg',0) # queryImage
img2 = cv2.imread('template-form.jpg',0) # trainImage
# Initiate SIFT detector
sift = cv2.xfeatures2d.SIFT_create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1,des2,k=2) …Run Code Online (Sandbox Code Playgroud)