Update 2020: You can now directly call OpenCV C/C++ or Python API to use Pi Camera without any configuration now, just like use a normal USB webcam. Here is the sample code:

// Opencv needs to be installed on your Raspberry Pi
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main() {
    VideoCapture cap(0); // if you only have 1 camera connected.
    if (!cap.isOpened()) {
        cout << "Cannot open camera\n";
        return -1;

    Mat frame;
    while (true) {
        bool ret = cap.read(frame); // or cap >> frame;
        if (!ret) {
            cout << "Error. Fail to receive frame.\n";
        // process frame
        if (waitKey(1) == 'q') {

    return 0;

Now, using the Pi Camera in the method mentioned above is advised. But the below old way still works.

Normally OpenCV C/C++ only supports USB camera for Raspberry Pi. If you want to use OpenCV C/C++ with Pi Camera module, I have a nice guide for you.

Before we set the Pi Camera, you have to install OpenCV native library firstly, you can follow my previous guide.

I use the RaspiCam library from Rafael Muñoz Salinas (very good job, easy installation and fast speed), it provides C++ API for us, frame per second is almost 30.

Here are steps:

  1. Plug the Pi camera into Raspberry Pi (I am using Raspberry Pi 2).

  2. Download RaspiCam library into your Pi.

  3. Install the library.

# uncompress the file
$ tar xvzf raspicam-0.1.3.tgz
# go to the library folder
$ cd raspicam-0.1.3

$ mkdir build

$ cd build

$ cmake ..

$ make

$ sudo make install
  1. Testing.
Picam Testing

The library provides cmake to compile the program, but it’s not convenient to use for me, so I wrote makefile to compile the program. Here is the makefile:

LIBS = -I/usr/local/include/ 
CFLAGS = -lraspicam -lraspicam_cv -lopencv_core -lopencv_highgui
objects= main.o camera.o

picam: $(objects) 
	g++ $(objects) -o picam $(LIBS)$(CFLAGS)

main.o: main.cpp camera.h
	g++ main.cpp -c

camera.o: camera.cpp camera.h
	g++ camera.cpp -c
.PHONY: clean
	rm picam $(objects)

The library provides some examples to us, I rewrote the sample code, actually we also can use OpenCV C API (I transfer cv::Mat to IplImage in sample code).

Here is sample code, download to your Raspberry Pi, make and run the program, FPS is ~29.7(CPU usage is 22%), amazing!