Rで集中線を描く
写真から顔を検出したら集中線を描くのが紳士のたしなみ。
以下のアルゴリズムを参考にRでタカヤナギ=サンに集中線を描きます。
http://stamefusa.hateblo.jp/entry/20120115/1326636719
顔領域の検出については以前の記事を参考のこと。
ひとまずこんな感じになります。
まだ集中線とは言い難いのでここからいい感じのパラメータを探したい。
library("imager") library("httr") MS_FACE_KEY <- "あなたのスクリプトキー" ### 顔領域の検出 url_image <- "https://raw.githubusercontent.com/dichika/ojisan/master/takayanagi_dj.jpg" # タカヤナギ=サン data_image <- load.image(url_image) tmp <- tempfile(fileext = ".png") save.image(data_image, tmp) url_base <- "https://westus.api.cognitive.microsoft.com/face/v1.0/detect" result <- POST(url_base, body = upload_file(tmp), query = list(returnFaceAttributes="age,gender,headPose,smile,facialHair,glasses,emotion", language="en"), add_headers(.headers = c(`Content-Type`="application/octet-stream", `Ocp-Apim-Subscription-Key`= MS_FACE_KEY ) ) ) %>% content() ### 検出された顔領域のデータを抽出して中心点を求める bbox <- lapply(result, function(x)x$faceRectangle) center <- data.frame(x = bbox[[1]]$left + bbox[[1]]$width * 0.5, y = bbox[[1]]$top + bbox[[1]]$height * 0.5) ### 集中線の描画 line_width <- 10 # 線の幅 move <- line_width * 3 # 集中線の間隔 plot(data_image, axes = FALSE) # 画像上下からの集中線 for(point_y in c(0, height(data_image))){ for(point_x in seq(0, width(data_image), by = move)){ p <- runif(1, 0.7, 0.8) a <- runif(1, 0.5, 1) polygon(x = c(point_x, point_x + line_width, point_x + p*(center$x - point_x)), y = c(point_y, point_y, point_y + p*(center$y - point_y)), density = 1000, col = rgb(1, 1, 1, a)) } } # 画像左右からの集中線 for(point_x in c(0, width(data_image))){ for(point_y in seq(0, height(data_image), by = move)){ p <- runif(1, 0.7, 0.8) a <- runif(1, 0.5, 1) polygon(x = c(point_x, point_x, point_x + p*(center$x - point_x)), y = c(point_y, point_y + line_width, point_y + p*(center$y - point_y)), density = 1000, col = rgb(1, 1, 1, a)) } }
Enjoy !!