Remap

Under the hood, many of the transformations to follow have a certain common element. In particular, they will be taking pixels from one place in the image and mapping them to another place. In this case, there will always be some smooth mapping, which will do what we need, but it will not always be a one-to-one pixel correspondence.

We sometimes want to accomplish this interpolation programmatically; that is, we'd like to apply some known algorithm that will determine the mapping. In other cases, however, we'd like to do this mapping ourselves. Before diving into some methods that will compute (and apply) these mappings for us, let's take a moment to look at the function responsible for applying the mappings that these other methods rely upon. The OpenCV function we want is called cvRemap():

void cvRemap(
  const CvArr* src,
  CvArr*       dst,
  const CvArr* mapx,
  const CvArr* mapy,
  int          flags   = CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,
  CvScalar     fillval = cvScalarAll(0)
);

The first two arguments of cvRemap() are the source and destination images, respectively. Obviously, these should be of the same size and number of channels, but they can have any data type. It is important to note that the two may not be the same image. [73] The next two arguments, mapx and mapy, indicate where any particular pixel is to be relocated. These should be the same size as the source and destination images, but they are single-channel and usually of data type float (IPL_DEPTH_32F). Noninteger mappings are OK, ...

Get Learning OpenCV now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.