编辑:我为此编写了一个Python 脚本。
由于您的目标模糊(为了隐私保护),您基本上需要一个高召回率检测器作为第一步。以下是如何去做。包含的代码提示将 OpenCV 与 Python 结合使用。
- 转换为灰度。
应用高斯模糊。
img = cv2.imread('input.jpg',1)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gray = cv2.GaussianBlur(img_gray, (5,5), 0)
让输入图像如下。
- 应用 Sobel 滤波器来检测垂直边缘。
使用严格阈值或 OTSU 的二值化对结果图像进行阈值化。
cv2.Sobel(image, -1, 1, 0)
cv2.threshold()
使用合适的结构元素应用形态闭合操作。(我使用 16x4 作为结构元素)
se = cv2.getStructuringElement(cv2.MORPH_RECT,(16,4))
cv2.morphologyEx(image, cv2.MORPH_CLOSE, se)
步骤 5 后的结果图像。
查找此图像的外部轮廓。
cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
对于每个轮廓,找到minAreaRect()
它的边界。
- 根据纵横比、最小和最大面积以及与水平线的角度选择矩形。(我使用 2.2 <= 纵横比 <= 8、500 <= 面积 <=15000 和角度 <= 45 度)
所有minAreaRect()
s 都以橙色显示,满足我们标准的 s 以绿色显示。
- 这一步之后可能会出现误报,要过滤它,请使用边缘密度。边缘密度定义为矩形中的白色像素数/总像素数。设置边缘密度的阈值。(我用的是 0.5)
- 模糊检测到的区域。
您可以应用您认为适合的其他过滤器来提高召回率和精度。也可以使用 HOG+SVM 训练检测以提高精度。