OpenCV Bindings for node.js
C++ JavaScript Python Makefile Shell Ruby HTML
Latest commit c867fb3 Feb 21, 2017 @peterbraden committed on GitHub Merge pull request #491 from woolite64/addReadImageMulti
Add readImageMulti that returns array of matrices via imreadmulti
Failed to load latest commit information.
data Update Car Detection cascade for example Feb 11, 2015
examples Fixed testing for imreadmulti on OpenCV < 3, added distanceTransform … Feb 20, 2017
inc Define a native interface for unwrapping the cv:Mat from a Matrix object Jan 21, 2016
lib Change name of DEBUG environment variable Oct 19, 2016
smoke Move smoke test into makefile Feb 11, 2015
src Fixed testing for imreadmulti on OpenCV < 3, added distanceTransform … Feb 20, 2017
test Forgot to move a console log from testing. Feb 20, 2017
utils Base OpenCV 3 port Feb 8, 2016
vagrant clean up vagrant folder Oct 5, 2015
.editorconfig stupid whitespace Sep 22, 2015
.gitignore Add code coverage Sep 22, 2016
.travis.yml Change DEBUG environment variable in .travis.yml Oct 19, 2016 Update bug fixes/enhancements Sep 23, 2016
CONTRIBUTORS Add code coverage Sep 22, 2016
Dockerfile Dockerfile: Instantiate opencv3 baseline Sep 23, 2015
MIT-LICENSE.txt add MIT license Sep 24, 2012
Makefile Change name of DEBUG environment variable Oct 19, 2016 Updates README link to Viola-Jones Haar Cascade Dec 14, 2016
appveyor.yml Missed a character... [publish binary] Feb 11, 2015
binding.gyp Move cflags and ldflags for mac to debug config Sep 22, 2016
include_dirs.js Define a native interface for unwrapping the cv:Mat from a Matrix object Jan 21, 2016
index.html Update documentup.min.js src Jul 15, 2016
js_code_style.xml Fix code formatting for native code closes #295 Sep 15, 2015
native_code_style.xml Fix code formatting for native code closes #295 Sep 15, 2015
package.json Merge pull request #446 from peterbraden/6-0-0-release Sep 23, 2016 Added info on how to create and name the branch to generate the OSX b… Nov 4, 2014


Build Status Coverage

OpenCV bindings for Node.js. OpenCV is the defacto computer vision library - by interfacing with it natively in node, we get powerful real time vision in js.

People are using node-opencv to fly control quadrocoptors, detect faces from webcam images and annotate video streams. If you're using it for something cool, I'd love to hear about it!


You'll need OpenCV 2.3.1 or newer installed before installing node-opencv. Note that OpenCV 3.x is not yet fully supported.

Specific for Windows

  1. Download and install OpenCV (Be sure to use a 2.4 version) @ For these instructions we will assume OpenCV is put at C:\OpenCV, but you can adjust accordingly.

  2. If you haven't already, create a system variable called OPENCV_DIR and set it to C:\OpenCV\build\x64\vc12

    Make sure the "x64" part matches the version of NodeJS you are using.

    Also add the following to your system PATH ;%OPENCV_DIR%\bin

  3. Install Visual Studio 2013. Make sure to get the C++ components. You can use a different edition, just make sure OpenCV supports it, and you set the "vcxx" part of the variables above to match.

  4. Download peterbraden/node-opencv fork git clone

  5. run npm install

$ npm install opencv


Run the examples from the parent directory.

Face Detection

cv.readImage("./examples/files/mona.png", function(err, im){
  im.detectObject(cv.FACE_CASCADE, {}, function(err, faces){
    for (var i=0;i<faces.length; i++){
      var x = faces[i]
      im.ellipse(x.x + x.width/2, x.y + x.height/2, x.width/2, x.height/2);

API Documentation


The matrix is the most useful base data structure in OpenCV. Things like images are just matrices of pixels.


new Matrix(rows, cols)

Or if you're thinking of a Matrix as an image:

new Matrix(height, width)

Or you can use opencv to read in image files. Supported formats are in the OpenCV docs, but jpgs etc are supported.

cv.readImage(filename, function(err, mat){

cv.readImage(buffer, function(err, mat){

If you need to pipe data into an image, you can use an ImageDataStream:

var s = new cv.ImageDataStream()

s.on('load', function(matrix){


If however, you have a series of images, and you wish to stream them into a stream of Matrices, you can use an ImageStream. Thus:

var s = new cv.ImageStream()

s.on('data', function(matrix){


Note: Each 'data' event into the ImageStream should be a complete image buffer.

Accessing Data

var mat = new cv.Matrix.Eye(4,4); // Create identity matrix

mat.get(0,0) // 1

mat.row(0)  // [1,0,0,0]
mat.col(4)  // [0,0,0,1]


var buff = mat.toBuffer()

Image Processing

im.canny(5, 300)

Simple Drawing

im.ellipse(x, y)
im.line([x1,y1], [x2, y2])

Object Detection

There is a shortcut method for Viola-Jones Haar Cascade object detection. This can be used for face detection etc.

mat.detectObject(haar_cascade_xml, opts, function(err, matches){})

For convenience in face detection, cv.FACE_CASCADE is a cascade that can be used for frontal face detection.





Using Contours

findContours returns a Contours collection object, not a native array. This object provides functions for accessing, computing with, and altering the contours contained in it. See relevant source code and examples

var contours = im.findContours();

// Count of contours in the Contours object

// Count of corners(verticies) of contour `index`

// Access vertex data of contours
for(var c = 0; c < contours.size(); ++c) {
  console.log("Contour " + c);
  for(var i = 0; i < contours.cornerCount(c); ++i) {
    var point = contours.point(c, i);
    console.log("(" + point.x + "," + point.y + ")");

// Computations of contour `index`
contours.arcLength(index, isClosed);

// Destructively alter contour `index`
contours.approxPolyDP(index, epsilon, isClosed);
contours.convexHull(index, clockwise);


Using tape. Run with command:

npm test.

Code coverage

Using istanbul and lcov. Run with command:

make cover

Build version of opencv.node will be generated, and coverage files will be put in coverage/ directory. These files can be remvoved automatically by running make clean.

MIT License

The library is distributed under the MIT License - if for some reason that doesn't work for you please get in touch.