Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Pixelate Face

livebooks/vix/pixelate.livemd

Pixelate Face

Mix.install([
  {:image, "~> 0.38"},
  {:evision, "~> 0.1"},
  {:req, "~> 0.3"},
  {:kino, "~> 0.12"}
])

画像の読込

ryo_img =
  "https://www.elixirconf.eu/assets/images/ryo-wakabayashi.png"
  |> Req.get!()
  |> Map.get(:body)
  |> Image.from_binary!()

モデルのダウンロード

face_model_path = "face_model.xml"

"https://github.com/opencv/opencv/raw/master/data/haarcascades/haarcascade_frontalface_default.xml"
|> Req.get!(connect_options: [timeout: 300_000], output: face_model_path)

face_model = Evision.CascadeClassifier.cascadeClassifier(face_model_path)

顔を検出する

face_rect =
  {left, top, width, height} =
  ryo_img
  |> Image.split_alpha()
  |> elem(0)
  |> Image.to_evision()
  |> elem(1)
  |> then(&Evision.CascadeClassifier.detectMultiScale(face_model, &1))
  |> List.first()

顔にモザイクをかける

face_img = Image.crop!(ryo_img, left, top, width, height)
pixelated_face_img = Image.pixelate!(face_img)
pixelated_ryo_img = Image.compose!(ryo_img, pixelated_face_img, x: left, y: top)

モザイク処理を繋げた場合

ryo_img
|> Image.crop!(left, top, width, height)
|> Image.pixelate!()
|> then(&Image.compose!(ryo_img, &1, x: left, y: top))