Boost::Python with OpenCV


In my previous post Configuring Boost::Python and Hello Boost, I have shown how to configure Boost::Python. I have managed to use OpenCV C++ with Python, using Boost::Python. I have been able to load and show an image successfully.

OpenCV C++:

First, write a simple function which will load and if required show an image using opencv. I have named it opencvtest.cpp

#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;

int load(string filename)
{

    Mat img = imread(filename,CV_LOAD_IMAGE_COLOR);
    //imshow("opencvtest",img);
    //waitKey(0);
    return 1;
}

Wrapping:

Wrap the above function using Boost::Python.

#include<boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(opencvtest)
{
    def("load",load);
}

Boost::Python wrapping is successfully done. I tried using bjam, but there were many complications. So, I am sticking to make.

Makefile:

PYTHON_VERSION = 2.7
PYTHON_INCLUDE = /usr/include/python$(PYTHON_VERSION)

# location of the Boost Python include files and library

BOOST_INC = /usr/include
BOOST_LIB = /usr/lib

# your filename here
TARGET = opencvtest

$(TARGET).so: $(TARGET).o
	g++ -shared -Wl,--export-dynamic $(TARGET).o -L$(BOOST_LIB) -lboost_python -L/usr/lib/python$(PYTHON_VERSION)/config -lpython$(PYTHON_VERSION) -o $(TARGET).so `pkg-config --libs opencv` `pkg-config --cflags opencv`

$(TARGET).o: $(TARGET).cpp
	g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c $(TARGET).cpp

Notice pkg-config added in the Makefile.

$ make

opencvtest.o and opencvtest.so binaries will be created.

Now, use the wrapper with Python.

Python:

import time
def timetest():
    image = "filename.jpg"
    t0 = time.time()
    from cv2.cv import LoadImage
    img = LoadImage(image)
    t1 = time.time()
    from opencvtest import load
    img2 = load(image)
    t2 = time.time()
    print "Time taken to load image using cv2.cv module:",
    print t1-t0
    print "Time taken to load image using boost wrapper:",
    print t2-t1

timetest()

Notice the significant difference between run time span of both the methods.

Here’s the complete gist.

Even I couldn’t believe that I could easily wrap OpenCV functions using Boost::Python. Now, I am planning to use Boost::Python to wrap OpenTLD and make a python port as well as wrap some important and time consuming iterations, functions using boost so that run-time speed of SimpleCV can be increased.

P.S. Going to Hyderabad to meet my brother. This is going to be exciting.

Playing around with Android UI

Articles focusing on Android UI - playing around with ViewPagers, CoordinatorLayout, meaningful motions and animations, implementing difficult customized views, etc.

Read next