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

Dou*_*ell 5 language-agnostic algorithm opencv polygon bounding-box

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

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

说我有这张收据:

在此处输入图片说明

凸包:

在此处输入图片说明

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

在此处输入图片说明

我的目标:(ms-paint):

在此处输入图片说明

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

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

alk*_*asm 3

通过对色彩空间过滤和形态学操作进行一些修改,我能够成功地使用 Harris 检测器。您也可以使用交叉点来扩展它,就像我在这里所做的那样,这可能很有用,尽管有点冗长。这对于这个特定的图像来说效果很好,但是对于管道来说,它需要很多参数(打开和关闭内核大小、迭代)。

我的实现是用 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)
Run Code Online (Sandbox Code Playgroud)

这是角落:

角球

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

我在图像上应用了色彩空间过滤、关闭和打开的蒙版,以便您可以在这些操作后看到蒙版。

过滤:

过滤

结束:

闭幕式

开幕:

开幕