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.
On Windows and MacOS, the package can be installed directoy from CRAN:
install.packages("opencv")To install from source on MacOS, you need to install the opencv library from homebrew:
brew install opencvOn Ubuntu or Fedora you need libopencv-dev or opencv-devel:
sudo apt-get install libopencv-devAnd then install the R bindings:
install.packages("opencv", type = "source")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')Live face detection:
library(opencv) ocv_video(ocv_face)Edge detection:
library(opencv) ocv_video(ocv_edges)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) })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)) })