編集:私はこれのためにPython スクリプトを書きました。
目的がぼやけているため (プライバシー保護のため)、基本的に最初のステップとして高再現率検出器が必要です。これを行う方法は次のとおりです。含まれているコード ヒントは、Python で OpenCV を使用します。
- グレースケールに変換します。
ガウスぼかしを適用します。
img = cv2.imread('input.jpg',1)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gray = cv2.GaussianBlur(img_gray, (5,5), 0)
入力画像を以下とする。
- ソーベル フィルターを適用して、垂直エッジを検出します。
厳密なしきい値または OTSU の 2 値化を使用して、結果の画像をしきい値処理します。
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 を使用して検出をトレーニングし、精度を高めることもできます。