見出し画像

【画像処理】OpenCV2を使って、車のナンバープレートをマスキングする。

車のナンバープレートなど、個人情報をマスキングしたい(隠したい)ケースがあったので、アノテーションされた箇所をOpenCV2を使って、マスキングする方法を調べてみました。

ゴール設定

今回は車の画像に対して、事前にナンバープレートを部分を特定して、その箇所を黒く塗りつぶしてマスキングすることをゴールとします。以下がそのイメージ。

元画像

画像1

マスキング後

画像2

アノテーションツールの準備

今回は矩形で囲むだけの単純なアノテーションなので、アノテーションツールは「labelImg」を使用しました。

Star:10.5k
License:MIT
CreatedAt:2015
*2020年05月06日現在

README.mdに従ってインストールしたら、すぐに利用開始できました。

pip3 install pyqt5 lxml # Install qt and lxml by pip
make qt5py3
python3 labelImg.py

このような形でナンバープレートを部分を矩形で囲んで、データを保存します。保存するときに、出力形式を、PascalVOCとYOLOで選択できるようです。

今回はデフォルトのPascalVOCフォーマットを選択。

画像3

マスキング処理

データが準備できたので、あとは指定された箇所を黒く塗りつぶせばOKです。OpenCV2を使ってマスキングします。

import xmltodict
import cv2
import numpy as np

with open("car.xml") as f:
   xml = f.read()

result = xmltodict.parse(xml)
bndbox = result["annotation"]["object"]["bndbox"]

xmin = bndbox["xmin"]
ymin = bndbox["ymin"]
xmax = bndbox["xmax"]
ymax = bndbox["ymax"]

contours = np.array([[xmin, ymin], [xmin, ymax], [
                   xmax, ymax], [xmax, ymin]], np.int32)

img = cv2.imread("car.jpg")
cv2.fillConvexPoly(img, points=contours, color=(0, 0, 0))
cv2.imwrite("masked.jpg", img)

これでナンバープレートを部分をマスキングできました。

画像4

次のステップ

今はナンバープレート部分を手動でアノテーションしていますが、機械学習や画像認識を使って自動で検出してマスキングしてくれるようにしていきたい。

あと矩形もlabelImgでは矩形しかできないが、ポリゴンとかで囲めるアノテーションツールを使った方が、ナンバープレート以外のところがマスキングされないので良さそう。


サポートして頂くと、こちらからもサポート返しさせて頂きます。