This chapter is a quick guide to setting up Python 2.7, OpenCV, and related libraries. After setup, we also look at OpenCV's Python sample scripts and documentation.
The following related libraries are covered:
For this book's purposes, OpenNI and SensorKinect can be considered optional. They are used throughout Chapter 5, Separating Foreground/Background Regions Depth, but are not used in the other chapters or appendices.
At the time of writing, OpenCV 2.4.3 is the latest version. On some operating systems, it is easier to set up an earlier version (2.3.1). The differences between these versions should not affect the project that we are going to build in this book.
Some additional information, particularly about OpenCV's build options and their dependencies, is available in the OpenCV wiki at http://opencv.willowgarage.com/wiki/InstallGuide. However, at the time of writing, the wiki is not up-to-date with OpenCV 2.4.3.
We are free to choose among various setup tools, depending on our operating system and how much configuration we want to do. Let's take an overview of the tools for Windows, Mac, Ubuntu, and other Unix-like systems.
Windows does not come with Python preinstalled. However, installation wizards are available for precompiled Python, NumPy, SciPy, and OpenCV. Alternatively, we can build from source. OpenCV's build system uses CMake for configuration and either Visual Studio or MinGW for compilation.
If we want support for depth cameras including Kinect, we should first install OpenNI and SensorKinect, which are available as precompiled binaries with installation wizards. Then, we must build OpenCV from source.
On Windows, OpenCV offers better support for 32-bit Python than 64-bit Python. Even if we are building from source, I recommend using 32-bit Python. Fortunately, 32-bit Python works fine on either 32-bit or 64-bit editions of Windows.
Some of the following steps refer to editing the system's Path
variable. This task can be done in the Environment Variables window of Control Panel.
On Windows Vista/Windows 7/Windows 8, open the Start menu and launch Control Panel. Now, go to System and Security | System | Advanced system settings. Click on the Environment Variables button.
On Windows XP, open the Start menu and go to Control Panel | System. Select the Advanced tab. Click on the Environment Variables button.
Now, under System variables, select Path and click on the Edit button. Make changes as directed. To apply the changes, click on all the OK buttons (until we are back in the main window of Control Panel). Then, log out and log back in (alternatively, reboot).
Here are the steps to set up 32-bit Python 2.7, NumPy, and OpenCV:
<unzip_destination>
. A subfolder, <unzip_destination>\opencv
, is created.<unzip_destination>\opencv\build\python\2.7\cv2.pyd
to C:\Python2.7\Lib\site-packages
(assuming we installed Python 2.7 to the default location). Now, the new Python installation can find OpenCV.Path
variable and append ;C:\Python2.7
(assuming we installed Python 2.7 to the default location). Remove any previous Python paths, such as ;C:\Python2.6
. Log out and log back in (alternatively, reboot).Windows does not come with any compilers or CMake. We need to install them. If we want support for depth cameras, including Kinect, we also need to install OpenNI and SensorKinect.
Let's assume that we have already installed 32-bit Python 2.7, NumPy, and SciPy either from binaries (as described previously) or from source. Now, we can proceed with installing compilers and CMake, optionally installing OpenNI and SensorKinect, and then building OpenCV from source:
For Microsoft Visual Studio 2010, use any installation media you purchased. During installation, include any optional C++ components. Reboot after installation is complete.
For Microsoft Visual C++ Express 2010, get the installer from http://www.microsoft.com/visualstudio/eng/downloads. Reboot after installation is complete.
For MinGW get the installer from http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/mingw-get-inst-20120426/mingw-get-inst-20120426.exe/download. When running the installer, make sure that the destination path does not contain spaces and that the optional C++ compiler is included. Edit the system's Path
variable and append ;C:\MinGW\bin
(assuming MinGW is installed to the default location.) Reboot the system.
<unzip_destination>
. A subfolder, <unzip_destination>\opencv
, is created.
> mkdir<build_folder>
Change directory to the build folder:
> cd <build_folder>
<unzip_destination>\opencv\CMakeLists.txt
. However, for this book's purposes, we only need to use the options that will give us a release build with Python bindings and, optionally, depth camera support via OpenNI and SensorKinect.For Visual Studio 2010 or Visual C++ Express 2010, run:
> cmake -D:CMAKE_BUILD_TYPE=RELEASE -D:WITH_OPENNI=ON -G "Visual Studio 10" <unzip_destination>\opencv
Alternatively, for MinGW, run:
> cmake -D:CMAKE_BUILD_TYPE=RELEASE -D:WITH_OPENNI=ON -G "MinGWMakefiles" <unzip_destination>\opencv
If OpenNI is not installed, omit -D:WITH_OPENNI=ON
. (In this case, depth cameras will not be supported.) If OpenNI and SensorKinect are installed to non-default locations, modify the command to include -D:OPENNI_LIB_DIR=<openni_install_destination>\Lib -D:OPENNI_INCLUDE_DIR=<openni_install_destination>\Include -D:OPENNI_PRIME_SENSOR_MODULE_BIN_DIR=<sensorkinect_install_destination>\Sensor\Bin
.
CMake might report that it has failed to find some dependencies. Many of OpenCV's dependencies are optional; so, do not be too concerned yet. If the build fails to complete or you run into problems later, try installing missing dependencies (often available as prebuilt binaries) and then rebuild OpenCV from this step.
For Visual Studio or Visual C++ Express, open <build_folder>/OpenCV.sln
. Select Release
configuration and build. If you get build errors, double-check that Release
configuration is selected.
Alternatively, for MinGW, run:
> mingw32-make.
<build_folder>\lib\Release\cv2.pyd
(from a Visual Studio build) or <build_folder>\lib\cv2.pyd
(from a MinGW build) to C:\Python2.7\Lib\site-packages
(assuming Python 2.7 is installed to the default location). Now, the Python installation can find part of OpenCV.Path
variable and append ;<build_folder>/bin/Release
(for a Visual Studio build) or ;<build_folder>/bin
(for a MinGW build). Reboot your system.Some versions of Mac come with Python 2.7 preinstalled. However, the preinstalled Python is customized by Apple for the system's internal needs. Normally, we should not install any libraries atop Apple's Python. If we do, our libraries might break during system updates or, worse, might conflict with preinstalled libraries that the system requires. Instead, we should install standard Python 2.7 and then install our libraries atop it.
For Mac, there are several possible approaches to obtaining standard Python 2.7, NumPy, SciPy, and OpenCV. All approaches ultimately require OpenCV to be compiled from source using Xcode Developer Tools. However, depending on the approach, this task is automated for us by third-party tools in various ways. We will look at approaches using MacPorts or Homebrew. These tools can potentially do everything that CMake can do, plus they help us resolve dependencies and separate our development libraries from the system libraries.
I recommend MacPorts, especially if you want to compile OpenCV with depth camera support via OpenNI and SensorKinect. Relevant patches and build scripts, including some that I maintain, are ready-made for MacPorts. By contrast, Homebrew does not currently provide a ready-made solution for compiling OpenCV with depth camera support.
Before proceeding, let's make sure that the Xcode Developer Tools are properly set up:
Now we have the required compilers for any approach.
We can use the MacPorts package manager to help us set up Python 2.7, NumPy, and OpenCV. MacPorts provides Terminal commands that automate the process of downloading, compiling, and installing various pieces of open source software (OSS). MacPorts also installs dependencies as needed. For each piece of software, the dependencies and build recipe are defined in a configuration file called a Portfile . A MacPorts repository is a collection of Portfiles.
Starting from a system where Xcode and its Command Line Tools are already set up, the following steps will give us an OpenCV installation via MacPorts:
/opt/local/etc/macports/sources.conf
(assuming MacPorts is installed to the default location). Just above the line rsync://rsync.macports.org/release/ports/ [default]
, add the following line:http://nummist.com/opencv/ports.tar.gz
Save the file. Now, MacPorts knows to search for Portfiles in my online repository first and, then, the default online repository.
$ sudo port selfupdate
$ sudo port install opencv +python27 +openni_sensorkinect
Alternatively (with or without my repository), run the following command to install OpenCV with Python 2.7 bindings and support for depth cameras excluding Kinect:
$ sudo port install opencv +python27 +openni
Dependencies, including Python 2.7, NumPy, OpenNI, and (in the first example) SensorKinect, are automatically installed as well.
By adding +python27
to the command, we are specifying that we want the opencv
variant (build configuration) with Python 2.7 bindings. Similarly, +openni_sensorkinect
specifies the variant with the broadest possible support for depth cameras via OpenNI and SensorKinect. You may omit +openni_sensorkinect
if you do not intend to use depth cameras or you may replace it with +openni
if you do intend to use OpenNI-compatible depth cameras but just not Kinect. To see the full list of available variants before installing, we can enter:
$ port variants opencv
Depending on our customization needs, we can add other variants to the install
command. For even more flexibility, we can write our own variants (as described in the next section).
$ sudo port install py27-scipy
python2.7
. If we want to link the default python
executable to python2.7
, let's also run:$ sudo port install python_select $ sudo port select python python27
With a few extra steps, we can change the way that MacPorts compiles OpenCV or any other piece of software. As previously mentioned, MacPorts' build recipes are defined in configuration files called Portfiles. By creating or editing Portfiles, we can access highly configurable build tools, such as CMake, while also benefitting from MacPorts' features, such as dependency resolution.
Let's assume that we already have MacPorts installed. Now, we can configure MacPorts to use custom Portfiles that we write:
<local_repository>
./opt/local/etc/macports/sources.conf
(assuming MacPorts is installed to the default location). Just above the line rsync://rsync.macports.org/release/ports/ [default]
, add this line:file://<local_repository>
For example, if <local_repository>
is /Users/Joe/Portfiles
, add:
file:///Users/Joe/Portfiles
Note the triple slashes.
Save the file. Now, MacPorts knows to search for Portfiles in <local_repository>
first and, then, its default online repository.
$ sudo port selfupdate
opencv
Portfile as an example. We should also copy the directory structure, which determines how the package is categorized by MacPorts.$ mkdir <local_repository>/graphics/ $ cp /opt/local/var/macports/sources/rsync.macports.org/release/ports/graphics/opencv <local_repository>/graphics
Alternatively, for an example that includes Kinect support, we could download my online repository from http://nummist.com/opencv/ports.tar.gz, unzip it and copy its entire graphics
folder into <local_repository>
:
$ cp <unzip_destination>/graphics <local_repository>
<local_repository>/graphics/opencv/Portfile
. Note that this file specifies CMake configuration flags, dependencies, and variants. For details on Portfile editing, go to http://guide.macports.org/#development.To see which CMake configuration flags are relevant to OpenCV, we need to look at its source code. Download the source code archive from http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.3/OpenCV-2.4.3.tar.bz2/download
, unzip it to any location, and read <unzip_destination>/OpenCV-2.4.3/CMakeLists.txt
.
After making any edits to the Portfile, save it.
$ cd <local_repository> $ portindex
opencv
just like any other MacPorts package. For example, we can install it as follows:
$ sudo port install opencv +python27 +openni_sensorkinect
Note that our local repository's Portfile takes precedence over the default repository's Portfile because of the order in which they are listed in /opt/local/etc/macports/sources.conf
.
Homebrew is another package manager that can help us. Normally, MacPorts and Homebrew should not be installed on the same machine.
Starting from a system where Xcode and its Command Line Tools are already set up, the following steps will give us an OpenCV installation via Homebrew:
$ ruby -e "$(curl -fsSkLraw.github.com/mxcl/homebrew/go)"
PATH
. To do so, create or edit the file ~/.profile
and add this line at the top:
export PATH=/usr/local/bin:/usr/local/sbin:$PATH
Save the file and run this command to refresh PATH
:
$ source ~/.profile
Note that executables installed by Homebrew now take precedence over executables installed by the system.
$ brew doctor
Follow any troubleshooting advice it gives.
$ brew update
$ brew install python
$ pip install numpy
gfortran
compiler:
$ brew install gfortran
Now, we can install SciPy:
$ pip install scipy
$ brew install opencv
Alternatively, to install OpenCV on a 32-bit system, run:
$ brew install opencv --build32
Homebrew makes it easy to edit existing package definitions:
$ brew edit opencv
The package definitions are actually scripts in the Ruby programming language. Tips on editing them can be found in the Homebrew wiki at https://github.com/mxcl/homebrew/wiki/Formula-Cookbook. A script may specify Make or CMake configuration flags, among other things.
To see which CMake configuration flags are relevant to OpenCV, we need to look at its source code. Download the source code archive from http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.3/OpenCV-2.4.3.tar.bz2/download, unzip it to any location, and read <unzip_destination>/OpenCV-2.4.3/CMakeLists.txt
.
After making any edits to the Ruby script, save it.
The customized package can be treated as normal. For example, it can be installed as follows:
$ brew install opencv
Ubuntu comes with Python 2.7 preinstalled. The standard Ubuntu repository contains OpenCV 2.3.1 packages without support for depth cameras. Alternatively, OpenCV 2.4.3 can be built from source using CMake and GCC. When built from source, OpenCV can support depth cameras via OpenNI and SensorKinect, which are available as precompiled binaries with installation scripts.
We can install OpenCV 2.3.1 and its dependencies using the Apt package manager:
$ sudo apt-get update
$ sudo apt-get install python-numpy $ sudo apt-get install python-scipy $ sudo apt-get install libopencv-* $ sudo apt-get install python-opencv
Enter Y
whenever prompted about package installation.
Equivalently, we could have used Ubuntu Software Center, which is Apt's graphical frontend.
Ubuntu comes with the GCC compilers preinstalled. However, we need to install the CMake build system. We also need to install or reinstall various other libraries, some of which need to be specially configured for compatibility with OpenCV. Because the dependencies are complex, I have written a script that downloads, configures, and builds OpenCV and related libraries so that the resulting OpenCV installation has support for depth cameras including Kinect:
<script_folder>
.<unzip_destination>/OpenCV-2.4.3/CMakeLists.txt
.After making any edits to the script, save it.
$ sudo apt-get update
<script_folder>
:
$ cd <script_folder>
Set the script's permissions so that it is executable:
$ chmod +x install_opencv_ubuntu.sh
Execute the script:
$ ./install_opencv_ubuntu.sh
When prompted, enter your password. Enter Y
whenever prompted about package installation.
<script_folder>/opencv
, which contains downloads and built files that are temporarily used by the script. After the installation script terminates, <script_folder>/opencv
may safely be deleted; although, first, you might want to look at OpenCV's Python samples in <script_folder>/opencv/samples/python
and <script_folder>/opencv/samples/python2
.The approaches for Ubuntu (as described previously) are likely to work on any Linux distribution derived from Ubuntu 12.04 LTS or Ubuntu 12.10, such as:
On Debian Linux and its derivatives, the Apt package manager works the same as on Ubuntu, though the available packages may differ.
On Gentoo Linux and its derivatives, the Portage package manager is similar to MacPorts (as described previously), though the available packages may differ.
On other Unix-like systems, the package manager and available packages may differ. Consult your package manager's documentation and search for any packages with opencv
in their names. Remember that OpenCV and its Python bindings might be split into multiple packages.
Also, look for any installation notes published by the system provider, the repository maintainer, or the community. Because OpenCV uses camera drivers and media codecs, getting all of its functionality to work can be tricky on systems with poor multimedia support. Under some circumstances, system packages might need to be reconfigured or reinstalled for compatibility.
If packages are available for OpenCV, check their version number. OpenCV 2.3.1 or greater is recommended for this book's purposes. Also check whether the packages offer Python bindings and whether they offer depth camera support via OpenNI and SensorKinect. Finally, check whether anyone in the developer community has reported success or failure in using the packages.
If instead we want to do a custom build of OpenCV from source, it might be helpful to refer to the installation script for Ubuntu (discussed previously) and adapt it to the package manager and packages that are present on another system.