相关疑难解决方法(0)

用透视投影进行矩形识别的Hough变换与Contour检测

我使用轮廓检测​​进行矩形检测,并在调整透视投影之前使用OpenCv应用多边形以获取矩形的位置.它工作得很好.但是我小组中的一些人建议转换Hough.我想知道使用Hough变换进行矩形检测是否有任何优势.

更新:我尝试了两种方法.在我的例子中,两种方法在Canny边缘检测后都能正常工作.但是由于霍夫变换产生线,我们必须假设几行,例如线的长度和线的可连接性,并且应该进行额外的计算,例如搜索连接的线并从连接的线找到角点.就个人而言,我更喜欢轮廓法,因为它的概念更简单.使用该方法,您只需搜索可以使用具有4个角的闭合和凸多边形近似的轮廓,并调整多边形的透视投影.就是这样.

opencv image-processing

18
推荐指数
2
解决办法
2万
查看次数

从轮廓 OpenCV 检测卡片 MinArea Quadrilateral

另一个关于检测图片中的卡片。我已经成功地隔离了图片中的卡片,我有一个很近的凸包,从这里我被卡住了。

对于上下文/约束,目标:

  • 检测图片中的卡片
  • 纯色背景(见示例)
  • 固定在前面的卡片类型(意思是:我们有宽/高比)
  • 每张照片一个对象(至少现在是这样)

我使用的方法:

  1. 缩小规模
  2. 灰度
  3. 光模糊
  4. 精明
  5. 查找轮廓
  6. 删除列表中小于 120 点的所有轮廓(尝试/错误值)
  7. 案例 1:我有 1 个轮廓:我的卡片的完美轮廓:第 9 步
  8. 案例 2:我有多个轮廓
    • 凸壳
    • 近似多边形 ?
  9. ???

第1、3、6步主要是去除噪声和小伪影。

所以我几乎卡在第 9 步。我试过一个示例图片:

样本

在调试图片上:

  • 绿色:轮廓
  • 红色:凸包
  • 紫色/粉红色:使用 approxPolyDp
  • 黄色:minAreaRect

(结果图片是从minAreaRect中提取的)

所以轮廓是可以接受的,我可以通过调整 canny 或第一次模糊的参数来做得更好。但现在这是可以接受的,现在的问题是,我怎样才能得到将形成“minarea 四边形”的 4 个点。如您所见, minAreaRect 给出了一个不完美的矩形,并且 approxPolyDp 丢失了太多的卡片。

有什么线索可以解决这个问题吗?我尝试在使用 approxPolyDp(我使用arcLength*0.1)时使用 epsilon 值,但没有。

这种方法的另一个问题是在 canny 期间丢失了一个角(参见示例),它将不起作用(除非使用 minAreaRect 时)。但这可能可以在之前(通过更好的预处理)或之后解决(因为我们知道宽/高比)。

在此处输入图片说明

不是在这里要求代码,只是想知道如何解决这个问题,

谢谢!

编辑:Yves Daoust 的解决方案:

  • 从凸包中获取与谓词匹配的8个点:(最大化x, x+y, y, -x+y, -x, -xy, -y, xy)
  • 从这个八边形,取4条最长的边,得到交点

结果:

结果

编辑 2:使用 Hough 变换(而不是 …

opencv image-processing

4
推荐指数
1
解决办法
5829
查看次数

OpenCV 图像匹配 - 表单照片与表单模板

我正在尝试检测照片是否代表填充了数据的预定义公式模板。

我是图像处理和 OpenCV 的新手,但我的第一次尝试是使用 FlannBasedMatcher 并比较检测到的关键点的数量。

有一个更好的方法吗?

填写表格.jpg

表单模板.jpg

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)

python opencv image-processing computer-vision

3
推荐指数
1
解决办法
2791
查看次数