OE 17. New Filter Engine - alalek/opencv GitHub Wiki

Make the new parallel FilterEngine

  • Author: Vadim Pisarevsky
  • Link: The feature request
  • Status: Draft
  • Platforms: All
  • Complexity: a few man-weeks

Introduction and Rationale

Since OpenCV 2.x there is FilterEngine class in imgproc module that is used to implement various separable and non-separable filters in OpenCV. The major reasons to design the FilterEngine many years ago were:

  • provide convenient mechanism to handle image borders without using all-image cv::copyMakeBorder
  • provide convenient mechanism to handle pipelines that include filtering operations. We need to say here that the goal has not been quite accomplished.

But there a few problems with the class:

  • it's quite complex code for what it does; from time to time we fix various memory access and other bugs in it
  • it does not support threading
  • it knows nothing about GPU/OpenCL
  • for some complex non-linear filters it's not flexible enough. For example, bilateral and median filter are implemented from scratch without using FilterEngine.

So, now it's time to simplify the code and at the same time provide more scalable solution.

Proposed solution

  • Instead of row-based engine that processes the whole image or the whole ROI sequentially, we need to have tile-based engine (where the tiles are not necessarily square).
  • The engine should include parallel_for loop, where each thread processes a subset of tiles
  • Border handling should be done automatically
  • In-place processing should be implemented efficiently where appropriate, otherwise it should be emulated by using something like cv::copyMakeBorder(src, temp);
  • For simplicity the question of pipelining filtering operations should be put out of scope.

Impact on existing code, compatibility

The FilterEngine class is not exposed since OpenCV 3.x, so there should not be any impact on the user code.

Possible alternatives

Very powerful alternative is Halide. Halide has been designed to do image filtering very efficiently. If we have Halide engine inside OpenCV, we probably do not need FilterEngine; we can implement most filters directly in Halide and get parallel and pipeline-able code.

References

TBD