In which we make OpenCV play nice with Anaconda under Windows and roll libjpeg-turbo in along the way.
You may have noticed, if you have been reading my blog, that I like to prototype in Python. I find Python to be almost as fun as Lisp when it comes to building up a solution without knowing exactly what the solution is going to look like. The reason I typically start in Python is the wealth of libraries; however, managing a Python install can become a real pain. Thanks to the people over at Continuum Analytics, you can be spared most of it.
Continuum Analytics produces a fantastic distribution known as Anaconda (or Miniconda depending on the route you choose). I won't go into all the reasons I think you should give it a try, but if you program in Python, you should check them out. The only shortcoming I have come across is the Windows build does not include OpenCV, but we will remedy that today. Along the way, I will also show you how to build OpenCV against libjpeg-turbo for better jpeg performance.
Things you will need:
- CMake: Used to generate makefiles/solutions to build OpenCV.
- Visual Studio: This article is geared towards VS, but you should be able to follow roughly the same steps for other compilers.
- OpenCV: The reason for this excursion. I downloaded the self extracting Windows package. You can just grab the source if you like.
- libjpeg-turbo: An optimized crossplatform library for working with jpegs.
- Anaconda (or Miniconda): My (and soon to be yours) favorite Python distribution.
Make sure your versions match, i.e. if you install 64 bit Anaconda, install the 64 bit version of libjpeg-turbo and build OpenCV for 64 bits.
If you use Miniconda to make your default Python installation Python 3 (as I have done) you will need to make a Python 2 environment. Please see here.
To the Bat Cave!
- Run the self extracting OpenCV archive if necessary, and extract OpenCV to a place you will remember, e.g. C:\OpenCV
- Run the installer for libjpeg-turbo
- If your default Python install is Python 3
- Right click on the cmake/bin directory while holding down Shift
- Click "Open command window here"
- Activate your Python 2 environment with
- Launch cmake-gui (from the command prompt in step 3 if necessary)
- Set "Where is the source code:" to the path in step 1
- Set "Where to build the binaries:" to where you normally build libs, e.g. C:\Libs\OpenCV
- Click Configure and wait for it to complete
- Check the Advanced checkbox
- Locate the option BUILD_JPEG and uncheck it
- Click the Add Entry button and add
- Name: JPEG_LIBRARY
- Type: FILEPATH
- Value: path to the static libjpeg-turbo64 e.g. C:/libjpeg-turbo64/lib/jpeg-static.lib
- Click the Add Entry button and add
- Name: JPEG_INCLUDE_DIR
- Type: PATH
- Value: path to the libjpeg-turbo64 include e.g. C:/libjpeg-turbo64/include
- If you see a message in the Configure output that says PYTHON_INCLUDE_DIR and/or PYTHON_LIBRARY are not found, you will need to set them by hand by clicking in the Value column and entering the path. On my system (Windows 8.1 Pro) these are C:/Users/lemoneer/Miniconda3/envs/python-2/include and C:/Users/lemoneer/Miniconda3/envs/python-2/libs/python27.lib respectively.
- Click Configure again and wait for it to complete
- Verify all is well in the output of Configure
- Click Generate
- Open the generated solution file in your build directory from step 6
- Change the build to Release
- Build the Solution
- Expand CMakeTargets in the Solution Explorer
- Right click on INSTALL
- Click Build
- Once the build is complete, update your path to include the OpenCV dlls
- You may Clean the Build at the solution level to remove intermediate files you do not need (this wont affect the install).
It is worth nothing that there are other build options worth considering like building the examples. Enable/disable to your heart's content then click Configure followed by Generate and Build.
If all goes well, you will have OpenCV dlls you can use from C/C++ as well as from your Python 2 environment.