Skip to contents

Experimenting with computer vision and machine learning in R. This package exposes some of the available ‘OpenCV’ 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.

CRAN_Status_Badge CRAN RStudio mirror downloads


On Windows and MacOS, the package can be installed directoy from CRAN:

Install from source

To install from source on MacOS, you need to install the opencv library from homebrew:

brew install opencv

On Ubuntu or Fedora you need libopencv-dev or opencv-devel:

sudo apt-get install libopencv-dev

And then install the R bindings:

install.packages("opencv", type = "source")

Basic stuff:

Face recognition:

unconf <- ocv_read('')
faces <- ocv_face(unconf)
ocv_write(faces, 'faces.jpg')

Or get the face location data:

facemask <- ocv_facemask(unconf)
attr(facemask, 'faces')

Live Webcam Examples

Live face detection:

Edge detection:

Combine with Graphics

Replaces the background with a plot:


# 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)
print(ggplot2::qplot(speed, dist, data = cars, geom = c("smooth", "point")))
bg <- ocv_read('bg.png')
  mask <- ocv_mog2(input)
  return(ocv_copyto(input, bg, mask))

Put your face in the plot:

# Overlay face filter
  mask <- ocv_facemask(input)
  ocv_copyto(input, bg, mask)

Live Face Survey

Go stand on the left if you’re a tidier


# 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)
  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)

# overlays faces on the plot
  mask <- ocv_facemask(input)
  faces <- attr(mask, 'faces')
  bg <- makeplot(faces$x)
  return(ocv_copyto(input, bg, mask))