Compiling OpenCV3 with extra contributed modules

This procedure is for OpenCV3 beta.
Some of the functions you might want like cv2.createBackgroundSubtractorGMG are not in the standard OpenCV 3 package at this time. The newer functions by design go into the opencv_contrib repository.

If you’re comfortable with the previous procedure, you might be ready to try adding these packages.

CRITICAL POINT: you must have the space between -D OPENCV_EXTRA_MODULES_PATH= for this to work, or it will silently ignore the opencv_contrib modules.

I will assume you have the prereqs installed already.

After the cmake command, scroll back up and check that you see something like (for example, look for bgsegm, that’s one of the opencv_contrib modules)

OpenCV modules:
 -- To be built: core imgproc imgcodecs videoio highgui xobjdetect adas video bgsegm bioinspired flann ml features2d calib3d ccalib face text datasets line_descriptor objdetect optflow photo reg rgbd saliency shape xfeatures2d stitching superres surface_matching videostab ximgproc xphoto python2 tracking ts
 -- Disabled: java world
 -- Disabled by dependency: -
 -- Unavailable: androidcamera cuda cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaoptflow cudastereo cudawarping cudev python3 viz cvv matlab

cd /tmp

git clone --branch 3.0.0-beta --depth 1 https://github.com/Itseez/opencv.git

git clone --branch 3.0.0-beta --depth 1 https://github.com/itseez/opencv_contrib

cd /tmp/opencv

mkdir release
cd release

cmake -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ -DBUILD_TIFF=ON -DBUILD_opencv_java=OFF -DWITH_CUDA=OFF -DENABLE_AVX=ON -DWITH_OPENGL=ON -DWITH_OPENCL=ON -DWITH_IPP=ON -DWITH_TBB=ON -DWITH_EIGEN=ON -DWITH_V4L=ON -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=$(python3 -c "import sys; print(sys.prefix)") -DPYTHON_EXECUTABLE=$(which python3) -DPYTHON_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -DPYTHON_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..
# the -j6 is for compilation only, to use up to 6 threads. It has no effect on the compiled opencv code execution
make -j6
make install

Once installed, you should be able to from within Python type:


import cv2
x = cv2.bgsegm.createBackgroundSubtractorGMG()

Python OpenCV2 vs. OpenCV3 API compatibility

The OpenCV2 API in Python is a vast improvement over the non-Numpy cumbersomeness of OpenCV1. Moving to OpenCV3 in Python, some slight changes were made to the API, that so far I have found some easy workarounds for.

Not so easy was the removal of “legacy” functions from OpenCV3, such as cv.CalcOpticalFlowHS. I don’t plan to find a workaround for those at this time.

Here are some example workarounds that allow the same Python code to work in OpenCV2 in Python 2.7 and OpenCV3 in Python 3.4.

FourCC and SimpleBlobDetector:

try:
    from cv2 import cv
    from cv import FOURCC as fourcc
    from cv2 import SimpleBlobDetector as SimpleBlobDetector
except ImportError:
    from cv2 import VideoWriter_fourcc as fourcc
    from cv2 import SimpleBlobDetector_create as SimpleBlobDetector

drawKeypoints

In OpenCV3, you must pass the outImage argument, and OpenCV2 is happy with this as well.

calcOpticalFlowFarneback

The third argument must be specified as flow= to be OpenCV2/3 compatible.

Anaconda Python: OpenCV3

I wanted to have access to OpenCV3 in Python3, so I compiled OpenCV3 for Anaconda Python3 as follows, using this reference.

I have not tried it, but I think that this would work for Python 2.7 as well by changing the python3 references to python2.

BE SURE when you type in Terminal
python3 that it’s the anaconda python you get. If not, make an alias in ~/.bash_aliases
alias python3="$HOME/anaconda3/bin/python3"


sudo apt-get install libjpeg-dev libpng-dev libtiff4-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev pkg-config cmake libgtk2.0-dev libeigen3-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev sphinx-common libtbb-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libopenexr-dev libgstreamer-plugins-base1.0-dev

cd /tmp
git clone –branch 3.0.0-beta –depth 1 https://github.com/Itseez/opencv.git
cd /tmp/opencv

mkdir release
cd release

cmake -DBUILD_TIFF=ON -DBUILD_opencv_java=OFF -DWITH_CUDA=OFF -DENABLE_AVX=ON -DWITH_OPENGL=ON -DWITH_OPENCL=ON -DWITH_IPP=ON -DWITH_TBB=ON -DWITH_EIGEN=ON -DWITH_V4L=ON -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=$(python3 -c “import sys; print(sys.prefix)”) -DPYTHON_EXECUTABLE=$(which python3) -DPYTHON_INCLUDE_DIR=$(python3 -c “from distutils.sysconfig import get_python_inc; print(get_python_inc())”) -DPYTHON_PACKAGES_PATH=$(python3 -c “from distutils.sysconfig import get_python_lib; print(get_python_lib())”) ..

# make -j6 applies up to 6 threads to compilation only, makes no difference to running opencv code

make -j6
make install

NOTE: I assume you’re using an Ubuntu 14.04 system, within Anaconda Python 3.4 installed to ~/anaconda3/

Note: I have disabled Cuda via “-DWITH_CUDA=OFF”, assuming you don’t have a GPU to use. Because Cuda takes so much longer to compile, even if you have the GPU, maybe first try without CUDA, to see if OpenCV3 is going to work for you, then recompile with CUDA.

Note: To avoid the libopencv_imgcodecs.so.3.0.0: undefined reference to `TIFFOpen@LIBTIFF_4.0′ type errors, I added the -DBUILD_TIFF=ON option

Note: If you get the error like
lib/libm.so.6: version `GLIBC_2.15′ not found (required by /usr/lib/x86_64-linux-gnu/libx264.so.142)

then try


cd ~/anaconda3/lib
mv libm.so.6 libm.so.6.bak

Importing old OpenCV modules from OpenCV 2 in Python on Windows

Some of the legacy modules like Horn Schunck Optical Flow in OpenCV 2.4 are located in “cv” instead of “cv2″ .

To be cross-platform compatible, instead of doing


import cv,cv2

I suggest doing

import cv2
from cv2 import cv

—————————————————-

Further, in Windows running Anaconda Python 2.7 (or whatever Python 2.7 you choose), OpenCV is not installable through conda.

To install OpenCV 2.4 for Python on Windows, do the following:

  1. From

    http://opencv.org/downloads.html

    download OpenCV for Windows, version 2.4

  2. Extract to a directory of your choice, let’s say c:\opencv and copy the file
    c:\opencv\build\python\2.7\x64\cv2.pyd
    to
    c:\Anaconda\Lib\site-packages\

If you’re using CPython instead of Anaconda, copy to that directory instead.

Writing multipage TIFF with Python

In my opinion, the most full-featured and easy to use method of writing multipage TIFF (all at once or via appending) is via tifffile.

You can also use the freeimage plugin to SciPy as one method to write multipage TIFF images, or libtiff.

For tifffile

just download and use tifffile.py  or type

pip install tifffile

For FreeImage (recommend tifffile instead)

On Windows you might see the error:
RuntimeError: Could not find a FreeImage library

On Linux you might see the error:
freeimage had a problem: Could not find a FreeImage library in any of…

To fix this on Windows, download the FreeImage DLL
Then extract the file
dist/FreeImage.dll
to the following directory (assuming you’re using Anaconda Python)
C:\Anaconda\Lib\site-packages\skimage\io\_plugins\

To fix this on Linux, type
sudo apt-get install libfreeimage3

Example code (assuming you have image stored in C-ordered 3-D array images):

from skimage.io._plugins import freeimage_plugin as freeimg
freeimg.write_multipage(images,'myimages.tiff')

or try this example test code

reference:

https://groups.google.com/a/continuum.io/forum/#!topic/anaconda/wFu3yJtmiBo

OpenCV cv.CalcOpticalFlowHS Horn-Schunck smoothness lambda parameter

More details to come, but I was comparing the performance of OpenCV to Matlab Computer Vision Toolbox for the dense estimates of optical flow given by the Horn Schunck algorithm. I was getting a very different result with OpenCV vs. Matlab for the Optical Flow Estimation. It seemed that OpenCV was washing out fine details in the optical flow. After carefully comparing Matlab Computer Vision and OpenCV outputs for Horn Schunck optical flow, I found that the default lambda/smoothness parameter of 1.0 for cv.CalcOpticalFlowHS is not the same as what Matlab calls 1.0.

I need to quantify this further, but for now I found that in OpenCV cv.CalcOpticalFlowHS setting lambda=0.001 gives results that are much more like Matlab–I can see the fine details. This is just a rough guess, if I have time I’ll quantify it in my forthcoming article on segmenting terabtyes of aurora borealis video in an hour!