Experimenting with computer vision and machine learning in R. This package exposes some of the available ‘OpenCV’ https://opencv.org/ algorithms, such as edge, body or face detection. These can either be applied to analyze static images, or to filter live video footage from a camera device.
Installation
On Windows and MacOS, the package can be installed directoy from CRAN:
install.packages("opencv")Install from source
To install from source on MacOS, you need to install the opencv library from homebrew:
On Ubuntu or Fedora you need libopencv-dev or opencv-devel:
And then install the R bindings:
install.packages("opencv", type = "source")Basic stuff:
Face recognition:
unconf <- ocv_read('https://jeroen.github.io/images/unconf18.jpg')
faces <- ocv_face(unconf)
ocv_write(faces, 'faces.jpg')Or get the face location data:
facemask <- ocv_facemask(unconf)
attr(facemask, 'faces')Combine with Graphics
Replaces the background with a plot:
library(opencv)
library(ggplot2)
# get webcam size
test <- ocv_picture()
bitmap <- ocv_bitmap(test)
width <- dim(bitmap)[2]
height <- dim(bitmap)[3]
png('bg.png', width = width, height = height)
par(ask=FALSE)
print(ggplot2::qplot(speed, dist, data = cars, geom = c("smooth", "point")))
dev.off()
bg <- ocv_read('bg.png')
unlink('pg.png')
ocv_video(function(input){
  mask <- ocv_mog2(input)
  return(ocv_copyto(input, bg, mask))
})Put your face in the plot:
# Overlay face filter
ocv_video(function(input){
  mask <- ocv_facemask(input)
  ocv_copyto(input, bg, mask)
})Live Face Survey
Go stand on the left if you’re a tidier
library(opencv)
# get webcam size
test <- ocv_picture()
bitmap <- ocv_bitmap(test)
width <- dim(bitmap)[2]
height <- dim(bitmap)[3]
# generates the plot
makeplot <- function(x){
  png('bg.png', width = width, height = height, res = 96)
  on.exit(unlink('bg.png'))
  groups <- seq(0, width, length.out = 4)
  left <- rep("left", sum(x < groups[2]))
  middle <- rep("middle", sum(x >= groups[2] & x < groups[3]))
  right <- rep("right", sum(x >= groups[3]))
  f <- factor(c(left, middle, right), levels = c('left', 'middle', 'right'),
              labels = c("Tidy!", "Whatever Works", "Base!"))
  color = I(c("#F1BB7B", "#FD6467", "#5B1A18"))
  plot(f, ylim = c(0, 5),
       main = "Are you a tidyer or baser?", col = color)
  dev.off()
  ocv_read('bg.png')
}
# overlays faces on the plot
ocv_video(function(input){
  mask <- ocv_facemask(input)
  faces <- attr(mask, 'faces')
  bg <- makeplot(faces$x)
  return(ocv_copyto(input, bg, mask))
})