Skip to content

Commit

Permalink
Add image blurring and utility functions
Browse files Browse the repository at this point in the history
  • Loading branch information
IgorGee committed Jan 2, 2017
1 parent b9dbd3e commit 69c1e8d
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 3 deletions.
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
"babel-cli": "^6.18.0",
"babel-preset-latest": "^6.16.0",
"bluebird": "^3.4.6",
"canvas": "^1.6.2",
"fluent-ffmpeg": "^2.1.0",
"imgur": "^0.2.0"
"imgur": "^0.2.0",
"stackblur-canvas": "^1.4.0"
}
}
75 changes: 75 additions & 0 deletions src/ImageUtil.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import StackBlur from 'stackblur-canvas'
import Canvas, { Image } from 'canvas'
import fs from 'fs'
import * as Api from './Api'
import path from 'path'

const blurImage = (file, videoResolution, face, radiusBlur=70) => {
const canvasOriginal = new Canvas(videoResolution.width, videoResolution.height)
const canvasBlur = new Canvas(videoResolution.width, videoResolution.height)
const ctxOriginal = canvasOriginal.getContext('2d')
const ctxBlur = canvasBlur.getContext('2d')

fs.readFile(file, (err, data) => {
if (err) console.error(err)

const img = new Canvas.Image
img.src = data

ctxOriginal.drawImage(img, 0, 0, img.width, img.height)
ctxBlur.drawImage(img, 0, 0, img.width, img.height)

const imageData = ctxOriginal.getImageData(face.x, face.y, face.width, face.height)
StackBlur.imageDataRGBA(imageData, face.x, face.y, face.width, face.height, radiusBlur)
ctxBlur.putImageData(imageData, face.x, face.y)
const stream = canvasBlur.createJPEGStream({ bufsize: 2048, quality: 100 })
const out = fs.createWriteStream(file)
stream.on('data', chunk => out.write(chunk))
})
}

let intermediateDir
const getNthImage = n => `./${intermediateDir}/${n}.jpg`

export const blurFacesInVideo = async (referenceImage, video, start=1, end=190, frequency=25) => {
return await new Promise(async (resolve, reject) => {
intermediateDir = `${video.src.slice(0,-4)}`
const refLink = await Api.getImgurLink(referenceImage)
let refFaceId = await Api.getReferenceFace(refLink)
refFaceId = refFaceId[0].faceId
console.log(refFaceId)
const candidates = {}

for (let i = start; i < end - frequency; i+=frequency) {
const frameLink = await Api.getImgurLink(getNthImage(i))
const faces = await Api.getFaces(frameLink)
for (let j = 0; j < faces.length; j++) {
const id = faces[j].faceId
const rectangle = faces[j].faceRectangle
candidates[id] = { frame: i, rectangle }
}
}

const candidateFaceIds = Object.keys(candidates)
console.log('CandidateFaceIds', candidateFaceIds)
const matches = await Api.getComparison(refFaceId, candidateFaceIds)
console.log('Matches', matches)

for (let i = 0; i < matches.length; i++) {
const id = matches[i].faceId
const { frame, rectangle } = candidates[id]
const face = {
x: rectangle.left,
y: rectangle.top,
width: rectangle.width + 50,
height: rectangle.height + 50
}

const startFrame = frame > 5 ? frame - 5 : frame
for (let i = startFrame; i < frame + 25; i++) {
blurImage(getNthImage(i), video.resolution, face)
}
}
resolve()
})
}
39 changes: 37 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,12 @@ buffer-shims@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"

canvas@^1.6.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/canvas/-/canvas-1.6.2.tgz#12b56e3f00e7880aa45e3aae59fe75237720aaa4"
dependencies:
nan "^2.4.0"

caseless@~0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
Expand Down Expand Up @@ -802,6 +808,12 @@ fill-range@^2.1.0:
repeat-element "^1.1.2"
repeat-string "^1.5.2"

findup-sync@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
dependencies:
glob "~5.0.0"

fluent-ffmpeg@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.0.tgz#e6ab85e75ba8e49119a3900cd9df10d39831d392"
Expand Down Expand Up @@ -921,7 +933,7 @@ glob@^4.0.5:
minimatch "^2.0.1"
once "^1.3.0"

glob@^5.0.5:
glob@^5.0.5, glob@~5.0.0:
version "5.0.15"
resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
dependencies:
Expand Down Expand Up @@ -954,6 +966,19 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"

grunt-cli@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8"
dependencies:
findup-sync "~0.3.0"
grunt-known-options "~1.1.0"
nopt "~3.0.6"
resolve "~1.1.0"

grunt-known-options@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.0.tgz#a4274eeb32fa765da5a7a3b1712617ce3b144149"

har-validator@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
Expand Down Expand Up @@ -1250,7 +1275,7 @@ ms@0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"

nan@^2.3.0:
nan@^2.3.0, nan@^2.4.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8"

Expand Down Expand Up @@ -1510,6 +1535,10 @@ request@^2.40.0, request@^2.79.0:
tunnel-agent "~0.4.1"
uuid "^3.0.0"

resolve@~1.1.0:
version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"

rimraf@2, rimraf@~2.5.1, rimraf@~2.5.4:
version "2.5.4"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
Expand Down Expand Up @@ -1567,6 +1596,12 @@ sshpk@^1.7.0:
jsbn "~0.1.0"
tweetnacl "~0.14.0"

stackblur-canvas@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-1.4.0.tgz#50ba7d8d7273967b47fdd586bb6b31c277a9d463"
dependencies:
grunt-cli "^1.2.0"

string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
Expand Down

0 comments on commit 69c1e8d

Please sign in to comment.