编辑:我写了一个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以橙色显示,满足我们标准的一个以绿色显示。
- 在执行此步骤后,可能会出现误报,要对其进行过滤,请使用边缘密度。边缘密度定义为白色像素数/矩形中的像素总数。设置边缘密度的阈值。(我用0.5)
- 模糊检测到的区域。
您可以应用其他您认为合适的过滤器来提高召回率和精度。还可以使用HOG + SVM训练检测以提高精度。