algorithm - 任何形状四边形的最小边界框或凸包?

标签 algorithm opencv language-agnostic polygon bounding-box

注意:我正在尝试制作一个可以处理一般范围的图像、方向和质量的过程,而不仅仅是特定于此图像。

我知道您可以使用凸包来用多边形包围一组点,并且可以使用多种算法中的一种为这些点创建最小边界框。但是,我想做类似于最小边界框的操作,但不将其限制为矩形。

假设我有这张收据:

enter image description here

凸包:

enter image description here

最小边界框(旋转卡尺):

enter image description here

我的目标:(ms-paint):

enter image description here

如您所见,最小边界框不太适用,因为从角度看收据是梯形。视角越低,情况就越糟。我想要有 4 个点,还有尖角,所以我不能使用凸包。

是否有一种算法可以用来获得类似于凸包或最小边界框的东西,但仅限于 4 个点和任何四边形形状?

最佳答案

通过对颜色空间过滤和形态学操作进行一些处理,我成功地使用了 Harris 检测器。您也可以像我一样使用交点扩展它 here来自 Hough Lines,虽然有点冗长,但可能有用。这适用于这个特定的图像,但对于管道,它需要很多参数(打开和关闭内核大小、迭代)。

我的实现是用 Python 实现的,但这当然也可以用 C++ 或 Java 实现:

import numpy as np
import cv2

# read image
img = cv2.imread('receipt.png')

# thresholding
blur = cv2.GaussianBlur(img, (5,5), 1)
hls = cv2.cvtColor(blur, cv2.COLOR_BGR2HLS)
low = np.array([0, 70, 0])
high = np.array([255, 255, 85])
thresh = cv2.inRange(hls, low, high)

# morphological operations to get the paper
kclose = np.ones((3,3), dtype=np.uint8)
kopen = np.ones((5,5), dtype=np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kclose, iterations=2)
opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kopen, iterations=6)

# corner detection
opening = cv2.GaussianBlur(opening, (3,3), 1)
opening = np.float32(opening)
dst = cv2.cornerHarris(opening, 2, 3, 0.04)

# drawing corners
dst = cv2.dilate(dst, None)
img[dst>0.01*dst.max()]=[0,0,255]

cv2.imshow('Corners', img)
cv2.waitKey(0)

这里是角落:

Corners

请注意,您从 Harris 获得了多个像素,因此如果您想在之后使用它们进行变形,则必须进行聚类以获得单个角点。

我在图像上应用了颜色空间过滤、关闭和打开的 mask ,这样您就可以在这些操作之后看到 mask 。

过滤:

Filtering

结束语:

Closing

开幕式:

Opening

关于algorithm - 任何形状四边形的最小边界框或凸包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44642712/

相关文章:

c++ - 带点更新的范围总和范围

opencv - "Image Recognition"功能太多

arrays - 在数组中查找添加/删除元素的算法

构造函数/函数重载签名查找时间复杂度?

algorithm - 当维基百科说在动态数组末尾插入一个项目的复杂性是 O(1) 摊销时,它是什么意思?

java - 为什么按钮看起来很奇怪?

performance - 按效率排序算法

python - 使用CUDA安装opencv时出错-opencv_cudaarithm错误

python - OpenCV 和 Python : Cover a colored mask over a image

string - 将字符串格式化为标题大小写