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 git libjpeg-dev libpng-dev libtiff5-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 -j4 applies up to 4 threads to compilation only, makes no difference to running opencv code

make -j4
make install

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

Note: If you get a lot of errors about 70% of the way through like
error: ‘CODEC_ID_H264’ was not declared in this scope
then try (I had to do this with Ubuntu 15.04:

sudo apt-get install libavcodec-ffmpeg-dev libavutil-ffmpeg-dev libavfilter-ffmpeg-dev libavformat-ffmpeg-dev libavresample-ffmpeg-dev

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

core dump

If you get SIGILL illegal instruction (Core dumped) when typing import cv2 let’s try to get more information by typing in Terminal

sudo sysctl -w kernel.core_pattern=core
ulimit -c unlimited

and rerun the command that gave the core dumped error. Now you’ll have a file “core” in that directory. Type in Terminal
gdb python core
and you’ll get some more hints about the failure. Don’t feel so frustrated, I have enabled a lot of options in that Cmake command above, so let’s try turning some of the optimizations off. Here I was testing on an Ubuntu 15.04 system with a Haswell CPU.

Here’s a minimal cmake to try if you get frustrated by errors:

cmake -DBUILD_TIFF=ON -DBUILD_opencv_java=OFF -DWITH_CUDA=OFF -DENABLE_AVX=OFF -DWITH_OPENGL=OFF -DWITH_OPENCL=OFF -DWITH_IPP=OFF -DWITH_TBB=OFF -DWITH_EIGEN=OFF -DWITH_V4L=OFF -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())") ..

Disable Fast Boot on Windows 10

Particularly for those dual-booting Windows 10, it’s useful to disable Fast Boot so that you can access the Windows 10 partition from another operating system (Windows or Linux).  On my Intel NUC, I didn’t notice more than a few additional seconds due to disabling fast boot.

As shown below, uncheck the Turn on fast startup under

Control Panel>Power Options>System Settings

which you can get to by going to Control Panel, Power Options, then on the left click “Choose what the power buttons do”

disable fast boot

IDL IDE (idlde) on Ubuntu 14.04 KDE desktop

I had the SIGSEGV error about libgobject-2.0.so.0 when running idlde from Terminal with KDE desktop on Ubuntu 14.04.

Following this procedure, from KDE desktop, I click the lower left “start” button on the desktop toolbar, go to “system settings” (you can start typing it in the start menu and it’ll come up) and make the following changes to get rid of the Oxygen theme.

  1. Style – Applications – Widget Style – Cleanlooks
  2. Icons – Theme – Humanity
  3. GTK – GTK Themes – GTK2 Theme – Ambience (also GTK3 Theme- Ambience).
  4. GTK – Icon Themes – Icon Theme – Humanity (also Fallback Theme – Humanity)

Now idlde ran without crashing for me.

Google Earth on Ubuntu 14.04

Even if your system is 64-bit, you should use 32-bit Google Earth at this time.

On some installs, typing in terminal
google-earth
gives the error
./googleearth-bin: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory
and libSM.so.6, etc.

This is remedied by typing:

sudo apt-get install libfontconfig1:i386 libX11-6:i386 libxrender1:i386 libxext6:i386 libsm6:i386

If you get errors about libGL.so.1, try:

sudo apt-get install libglu1-mesa:i386 libgl1-mesa-glx:i386

If you still get errors about libGL.so.1, try:

find /usr -name "libGL.so.1"

let’s assume you found it in /usr/lib/i386-linux-gnu/mesa
Then type

ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib

Enabling extra apt-get software/apps on Beaglebone

By default, the Beaglebone Black with Debian as of this writing doesn’t have packages like python-scipy in the repositories. This is simple to fix by enabling the “backports” repo as follows.


sudo nano /etc/apt/sources.list

and uncomment the line

deb http://ftp.debian.org/debian wheezy-backports main contrib non-free

then type

sudo apt-get update

Note: Some of the Python packages might be of versions older than you’d like (e.g. Scipy 0.10). You can try the pip install method in those particular cases.

Fixing Beaglebone Black Rev. C error on apt-get

I experienced an error upon any use of apt-get with a new Rev. C Beaglebone with the factory Debian install.

The error was like:

insserv: Starting led_aging.sh depends on rc.local and therefore on system facility ` $all’ which can not be true!
Here was the fix by replacing /etc/init.d/led_aging.sh with:

#!/bin/sh -e
### BEGIN INIT INFO
# Provides: led_aging.sh
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start LED aging
# Description: Starts LED aging (whatever that is)
### END INIT INFO

x=$(/bin/ps -ef | /bin/grep “[l]ed_acc”)
if [ ! -n “$x” -a -x /usr/bin/led_acc ]; then
/usr/bin/led_acc &
fi