The default package for OpenCV on Fedora 20 (f20) is
The performance of such algorithms as
opencv_traincascade can be optimized via the installation of additional packages, and then enabling them when rebuilding OpenCV with various build flags.
Looking through the
opencv.spec SRPM file, various enable flags are provided for configuration tweaking and tuning purposes when rebuilding with
The most relevant for optimization:
--with eigen3 --with sse3
The most relevant for extending capabilities:
--with ffmpeg --with openni
The default package can be rebuilt with these optimizations using syntax like:
rpmbuild -ba opencv.spec --with ffmpeg --with openni --with eigen3 --with sse3
However, even when using these flags on f20, the output provided by cmake at configuration time as per doesn’t enthuse. So, rebuild upstream sources without RPM to master the package configuration, and then bring this knowledge back into the RPM package. Old school, yo.
Looking at the upstream source repository, and then rebasing the f20 sources to the latest release of OpenCV (2.4.9) starts off the SRPM hacking. To get a cmake build going, build the opencv sources as specified in the link, to get dependency tracking working.
CMakeLists.txt has the build-time configure options.
A list of the most interesting:
WITH_CUDA WITH_CUFFT WITH_BLAS WITH_FFMPEG WITH_OPENNI WITH_EIGEN WITH_IPP WITH_TBB / BUILD_TBB WITH_OPENMP WITH_OPENCL enable_dynamic_cuda enable_fast_math enable_sse3
Setup, Install Prerequisites.
A couple of these are easy to enable, with dependencies already pre-packaged.
For development, you’ll need the following dependencies:
yum install -y gtk2-devel libtheora-devel libvorbis-devel libraw1394-devel libdc1394-devel jasper-devel libpng-devel libjpeg-devel libtiff-devel libv4l-devel libGL-devel gtkglext-devel OpenEXR-devel zlib-devel python2-devel swig python-sphinx gstreamer-devel gstreamer-plugins-base-devel opencl-headers gstreamer-plugins-bad-free-devel gstreamer-python-devel gstreamer-devel gstreamer-plugins-bad-free-devel-docs gstreamer-plugins-base-devel-docs gstreamer-plugins-ugly-devel-docs libpng12-devel mesa-libGLES-devel
To execute binaries that have been compiled with this optimized version of opencv, one will need to install the OpenCL runtime.
yum install -y openni openni-devel openni-doc
yum install -y ffmpeg ffmpeg-devel
yum install -y tbb tbb-devel tbb-doc
yum install -y eigen3-devel eigen3-doc
WITH_IPP, more elaborate configuration is required. First, install Intel Performance Primitives (aka IPP). From the User’s Guide: Note that opencv_traincascade application can use TBB for multi-threading. To use it in multicore mode OpenCV must be built with TBB.
After IPP is installed, the system must be configured to use it easily. To fixup PATHs, pick one of two options.
One: add the following to
Two: edit /etc/ldso.conf.d and add
tbb.conf /opt/intel/lib/intel64 ipp.conf /opt/intel/ipp/lib/intel64
Furthermore, for OpenCV configuration to find the installed IPP at SRPM build time, the environment variable
IPPROOT must be set, as follows:
setenv IPPROOT /opt/intel/ipp
Build the modified opencv package with the following custom SPEC file. No configuration options are necessary: WITH_IPP, WITH_TBB, WITH_EIGEN are all enabled.
Then, force install it over the default libs as follows:
rpm -Uvh --nodeps opencv-2.4.9-3 etc etc.
Recompile the opencv app in question, and volia. Optimized. Speedups may vary, seeing ~ 2.3x speedups in processing times.