removed optim module; moved its functionality to core and photo modules; moved drawing functions from core to imgproc. Removed FilterEngine etc. from public API
This commit is contained in:
2553
modules/imgproc/src/drawing.cpp
Normal file
2553
modules/imgproc/src/drawing.cpp
Normal file
File diff suppressed because it is too large
Load Diff
375
modules/imgproc/src/filterengine.hpp
Normal file
375
modules/imgproc/src/filterengine.hpp
Normal file
@@ -0,0 +1,375 @@
|
||||
/*
|
||||
By downloading, copying, installing or using the software you agree to this license.
|
||||
If you do not agree to this license, do not download, install,
|
||||
copy or use the software.
|
||||
|
||||
|
||||
License Agreement
|
||||
For Open Source Computer Vision Library
|
||||
(3-clause BSD License)
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the names of the copyright holders nor the names of the contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
This software is provided by the copyright holders and contributors "as is" and
|
||||
any express or implied warranties, including, but not limited to, the implied
|
||||
warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
In no event shall copyright holders or contributors be liable for any direct,
|
||||
indirect, incidental, special, exemplary, or consequential damages
|
||||
(including, but not limited to, procurement of substitute goods or services;
|
||||
loss of use, data, or profits; or business interruption) however caused
|
||||
and on any theory of liability, whether in contract, strict liability,
|
||||
or tort (including negligence or otherwise) arising in any way out of
|
||||
the use of this software, even if advised of the possibility of such damage.
|
||||
*/
|
||||
|
||||
#ifndef __OPENCV_IMGPROC_FILTERENGINE_HPP__
|
||||
#define __OPENCV_IMGPROC_FILTERENGINE_HPP__
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
//! type of the kernel
|
||||
enum
|
||||
{
|
||||
KERNEL_GENERAL = 0, // the kernel is generic. No any type of symmetry or other properties.
|
||||
KERNEL_SYMMETRICAL = 1, // kernel[i] == kernel[ksize-i-1] , and the anchor is at the center
|
||||
KERNEL_ASYMMETRICAL = 2, // kernel[i] == -kernel[ksize-i-1] , and the anchor is at the center
|
||||
KERNEL_SMOOTH = 4, // all the kernel elements are non-negative and summed to 1
|
||||
KERNEL_INTEGER = 8 // all the kernel coefficients are integer numbers
|
||||
};
|
||||
|
||||
/*!
|
||||
The Base Class for 1D or Row-wise Filters
|
||||
|
||||
This is the base class for linear or non-linear filters that process 1D data.
|
||||
In particular, such filters are used for the "horizontal" filtering parts in separable filters.
|
||||
|
||||
Several functions in OpenCV return Ptr<BaseRowFilter> for the specific types of filters,
|
||||
and those pointers can be used directly or within cv::FilterEngine.
|
||||
*/
|
||||
class BaseRowFilter
|
||||
{
|
||||
public:
|
||||
//! the default constructor
|
||||
BaseRowFilter();
|
||||
//! the destructor
|
||||
virtual ~BaseRowFilter();
|
||||
//! the filtering operator. Must be overrided in the derived classes. The horizontal border interpolation is done outside of the class.
|
||||
virtual void operator()(const uchar* src, uchar* dst, int width, int cn) = 0;
|
||||
|
||||
int ksize;
|
||||
int anchor;
|
||||
};
|
||||
|
||||
|
||||
/*!
|
||||
The Base Class for Column-wise Filters
|
||||
|
||||
This is the base class for linear or non-linear filters that process columns of 2D arrays.
|
||||
Such filters are used for the "vertical" filtering parts in separable filters.
|
||||
|
||||
Several functions in OpenCV return Ptr<BaseColumnFilter> for the specific types of filters,
|
||||
and those pointers can be used directly or within cv::FilterEngine.
|
||||
|
||||
Unlike cv::BaseRowFilter, cv::BaseColumnFilter may have some context information,
|
||||
i.e. box filter keeps the sliding sum of elements. To reset the state BaseColumnFilter::reset()
|
||||
must be called (e.g. the method is called by cv::FilterEngine)
|
||||
*/
|
||||
class BaseColumnFilter
|
||||
{
|
||||
public:
|
||||
//! the default constructor
|
||||
BaseColumnFilter();
|
||||
//! the destructor
|
||||
virtual ~BaseColumnFilter();
|
||||
//! the filtering operator. Must be overrided in the derived classes. The vertical border interpolation is done outside of the class.
|
||||
virtual void operator()(const uchar** src, uchar* dst, int dststep, int dstcount, int width) = 0;
|
||||
//! resets the internal buffers, if any
|
||||
virtual void reset();
|
||||
|
||||
int ksize;
|
||||
int anchor;
|
||||
};
|
||||
|
||||
|
||||
/*!
|
||||
The Base Class for Non-Separable 2D Filters.
|
||||
|
||||
This is the base class for linear or non-linear 2D filters.
|
||||
|
||||
Several functions in OpenCV return Ptr<BaseFilter> for the specific types of filters,
|
||||
and those pointers can be used directly or within cv::FilterEngine.
|
||||
|
||||
Similar to cv::BaseColumnFilter, the class may have some context information,
|
||||
that should be reset using BaseFilter::reset() method before processing the new array.
|
||||
*/
|
||||
class BaseFilter
|
||||
{
|
||||
public:
|
||||
//! the default constructor
|
||||
BaseFilter();
|
||||
//! the destructor
|
||||
virtual ~BaseFilter();
|
||||
//! the filtering operator. The horizontal and the vertical border interpolation is done outside of the class.
|
||||
virtual void operator()(const uchar** src, uchar* dst, int dststep, int dstcount, int width, int cn) = 0;
|
||||
//! resets the internal buffers, if any
|
||||
virtual void reset();
|
||||
|
||||
Size ksize;
|
||||
Point anchor;
|
||||
};
|
||||
|
||||
|
||||
/*!
|
||||
The Main Class for Image Filtering.
|
||||
|
||||
The class can be used to apply an arbitrary filtering operation to an image.
|
||||
It contains all the necessary intermediate buffers, it computes extrapolated values
|
||||
of the "virtual" pixels outside of the image etc.
|
||||
Pointers to the initialized cv::FilterEngine instances
|
||||
are returned by various OpenCV functions, such as cv::createSeparableLinearFilter(),
|
||||
cv::createLinearFilter(), cv::createGaussianFilter(), cv::createDerivFilter(),
|
||||
cv::createBoxFilter() and cv::createMorphologyFilter().
|
||||
|
||||
Using the class you can process large images by parts and build complex pipelines
|
||||
that include filtering as some of the stages. If all you need is to apply some pre-defined
|
||||
filtering operation, you may use cv::filter2D(), cv::erode(), cv::dilate() etc.
|
||||
functions that create FilterEngine internally.
|
||||
|
||||
Here is the example on how to use the class to implement Laplacian operator, which is the sum of
|
||||
second-order derivatives. More complex variant for different types is implemented in cv::Laplacian().
|
||||
|
||||
\code
|
||||
void laplace_f(const Mat& src, Mat& dst)
|
||||
{
|
||||
CV_Assert( src.type() == CV_32F );
|
||||
// make sure the destination array has the proper size and type
|
||||
dst.create(src.size(), src.type());
|
||||
|
||||
// get the derivative and smooth kernels for d2I/dx2.
|
||||
// for d2I/dy2 we could use the same kernels, just swapped
|
||||
Mat kd, ks;
|
||||
getSobelKernels( kd, ks, 2, 0, ksize, false, ktype );
|
||||
|
||||
// let's process 10 source rows at once
|
||||
int DELTA = std::min(10, src.rows);
|
||||
Ptr<FilterEngine> Fxx = createSeparableLinearFilter(src.type(),
|
||||
dst.type(), kd, ks, Point(-1,-1), 0, borderType, borderType, Scalar() );
|
||||
Ptr<FilterEngine> Fyy = createSeparableLinearFilter(src.type(),
|
||||
dst.type(), ks, kd, Point(-1,-1), 0, borderType, borderType, Scalar() );
|
||||
|
||||
int y = Fxx->start(src), dsty = 0, dy = 0;
|
||||
Fyy->start(src);
|
||||
const uchar* sptr = src.data + y*src.step;
|
||||
|
||||
// allocate the buffers for the spatial image derivatives;
|
||||
// the buffers need to have more than DELTA rows, because at the
|
||||
// last iteration the output may take max(kd.rows-1,ks.rows-1)
|
||||
// rows more than the input.
|
||||
Mat Ixx( DELTA + kd.rows - 1, src.cols, dst.type() );
|
||||
Mat Iyy( DELTA + kd.rows - 1, src.cols, dst.type() );
|
||||
|
||||
// inside the loop we always pass DELTA rows to the filter
|
||||
// (note that the "proceed" method takes care of possibe overflow, since
|
||||
// it was given the actual image height in the "start" method)
|
||||
// on output we can get:
|
||||
// * < DELTA rows (the initial buffer accumulation stage)
|
||||
// * = DELTA rows (settled state in the middle)
|
||||
// * > DELTA rows (then the input image is over, but we generate
|
||||
// "virtual" rows using the border mode and filter them)
|
||||
// this variable number of output rows is dy.
|
||||
// dsty is the current output row.
|
||||
// sptr is the pointer to the first input row in the portion to process
|
||||
for( ; dsty < dst.rows; sptr += DELTA*src.step, dsty += dy )
|
||||
{
|
||||
Fxx->proceed( sptr, (int)src.step, DELTA, Ixx.data, (int)Ixx.step );
|
||||
dy = Fyy->proceed( sptr, (int)src.step, DELTA, d2y.data, (int)Iyy.step );
|
||||
if( dy > 0 )
|
||||
{
|
||||
Mat dstripe = dst.rowRange(dsty, dsty + dy);
|
||||
add(Ixx.rowRange(0, dy), Iyy.rowRange(0, dy), dstripe);
|
||||
}
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
*/
|
||||
class FilterEngine
|
||||
{
|
||||
public:
|
||||
//! the default constructor
|
||||
FilterEngine();
|
||||
//! the full constructor. Either _filter2D or both _rowFilter and _columnFilter must be non-empty.
|
||||
FilterEngine(const Ptr<BaseFilter>& _filter2D,
|
||||
const Ptr<BaseRowFilter>& _rowFilter,
|
||||
const Ptr<BaseColumnFilter>& _columnFilter,
|
||||
int srcType, int dstType, int bufType,
|
||||
int _rowBorderType = BORDER_REPLICATE,
|
||||
int _columnBorderType = -1,
|
||||
const Scalar& _borderValue = Scalar());
|
||||
//! the destructor
|
||||
virtual ~FilterEngine();
|
||||
//! reinitializes the engine. The previously assigned filters are released.
|
||||
void init(const Ptr<BaseFilter>& _filter2D,
|
||||
const Ptr<BaseRowFilter>& _rowFilter,
|
||||
const Ptr<BaseColumnFilter>& _columnFilter,
|
||||
int srcType, int dstType, int bufType,
|
||||
int _rowBorderType = BORDER_REPLICATE,
|
||||
int _columnBorderType = -1,
|
||||
const Scalar& _borderValue = Scalar());
|
||||
//! starts filtering of the specified ROI of an image of size wholeSize.
|
||||
virtual int start(Size wholeSize, Rect roi, int maxBufRows = -1);
|
||||
//! starts filtering of the specified ROI of the specified image.
|
||||
virtual int start(const Mat& src, const Rect& srcRoi = Rect(0,0,-1,-1),
|
||||
bool isolated = false, int maxBufRows = -1);
|
||||
//! processes the next srcCount rows of the image.
|
||||
virtual int proceed(const uchar* src, int srcStep, int srcCount,
|
||||
uchar* dst, int dstStep);
|
||||
//! applies filter to the specified ROI of the image. if srcRoi=(0,0,-1,-1), the whole image is filtered.
|
||||
virtual void apply( const Mat& src, Mat& dst,
|
||||
const Rect& srcRoi = Rect(0,0,-1,-1),
|
||||
Point dstOfs = Point(0,0),
|
||||
bool isolated = false);
|
||||
//! returns true if the filter is separable
|
||||
bool isSeparable() const { return !filter2D; }
|
||||
//! returns the number
|
||||
int remainingInputRows() const;
|
||||
int remainingOutputRows() const;
|
||||
|
||||
int srcType;
|
||||
int dstType;
|
||||
int bufType;
|
||||
Size ksize;
|
||||
Point anchor;
|
||||
int maxWidth;
|
||||
Size wholeSize;
|
||||
Rect roi;
|
||||
int dx1;
|
||||
int dx2;
|
||||
int rowBorderType;
|
||||
int columnBorderType;
|
||||
std::vector<int> borderTab;
|
||||
int borderElemSize;
|
||||
std::vector<uchar> ringBuf;
|
||||
std::vector<uchar> srcRow;
|
||||
std::vector<uchar> constBorderValue;
|
||||
std::vector<uchar> constBorderRow;
|
||||
int bufStep;
|
||||
int startY;
|
||||
int startY0;
|
||||
int endY;
|
||||
int rowCount;
|
||||
int dstY;
|
||||
std::vector<uchar*> rows;
|
||||
|
||||
Ptr<BaseFilter> filter2D;
|
||||
Ptr<BaseRowFilter> rowFilter;
|
||||
Ptr<BaseColumnFilter> columnFilter;
|
||||
};
|
||||
|
||||
|
||||
//! returns type (one of KERNEL_*) of 1D or 2D kernel specified by its coefficients.
|
||||
int getKernelType(InputArray kernel, Point anchor);
|
||||
|
||||
//! returns the primitive row filter with the specified kernel
|
||||
Ptr<BaseRowFilter> getLinearRowFilter(int srcType, int bufType,
|
||||
InputArray kernel, int anchor,
|
||||
int symmetryType);
|
||||
|
||||
//! returns the primitive column filter with the specified kernel
|
||||
Ptr<BaseColumnFilter> getLinearColumnFilter(int bufType, int dstType,
|
||||
InputArray kernel, int anchor,
|
||||
int symmetryType, double delta = 0,
|
||||
int bits = 0);
|
||||
|
||||
//! returns 2D filter with the specified kernel
|
||||
Ptr<BaseFilter> getLinearFilter(int srcType, int dstType,
|
||||
InputArray kernel,
|
||||
Point anchor = Point(-1,-1),
|
||||
double delta = 0, int bits = 0);
|
||||
|
||||
//! returns the separable linear filter engine
|
||||
Ptr<FilterEngine> createSeparableLinearFilter(int srcType, int dstType,
|
||||
InputArray rowKernel, InputArray columnKernel,
|
||||
Point anchor = Point(-1,-1), double delta = 0,
|
||||
int rowBorderType = BORDER_DEFAULT,
|
||||
int columnBorderType = -1,
|
||||
const Scalar& borderValue = Scalar());
|
||||
|
||||
//! returns the non-separable linear filter engine
|
||||
Ptr<FilterEngine> createLinearFilter(int srcType, int dstType,
|
||||
InputArray kernel, Point _anchor = Point(-1,-1),
|
||||
double delta = 0, int rowBorderType = BORDER_DEFAULT,
|
||||
int columnBorderType = -1, const Scalar& borderValue = Scalar());
|
||||
|
||||
//! returns the Gaussian filter engine
|
||||
Ptr<FilterEngine> createGaussianFilter( int type, Size ksize,
|
||||
double sigma1, double sigma2 = 0,
|
||||
int borderType = BORDER_DEFAULT);
|
||||
|
||||
//! returns filter engine for the generalized Sobel operator
|
||||
Ptr<FilterEngine> createDerivFilter( int srcType, int dstType,
|
||||
int dx, int dy, int ksize,
|
||||
int borderType = BORDER_DEFAULT );
|
||||
|
||||
//! returns horizontal 1D box filter
|
||||
Ptr<BaseRowFilter> getRowSumFilter(int srcType, int sumType,
|
||||
int ksize, int anchor = -1);
|
||||
|
||||
//! returns vertical 1D box filter
|
||||
Ptr<BaseColumnFilter> getColumnSumFilter( int sumType, int dstType,
|
||||
int ksize, int anchor = -1,
|
||||
double scale = 1);
|
||||
//! returns box filter engine
|
||||
Ptr<FilterEngine> createBoxFilter( int srcType, int dstType, Size ksize,
|
||||
Point anchor = Point(-1,-1),
|
||||
bool normalize = true,
|
||||
int borderType = BORDER_DEFAULT);
|
||||
|
||||
|
||||
//! returns horizontal 1D morphological filter
|
||||
Ptr<BaseRowFilter> getMorphologyRowFilter(int op, int type, int ksize, int anchor = -1);
|
||||
|
||||
//! returns vertical 1D morphological filter
|
||||
Ptr<BaseColumnFilter> getMorphologyColumnFilter(int op, int type, int ksize, int anchor = -1);
|
||||
|
||||
//! returns 2D morphological filter
|
||||
Ptr<BaseFilter> getMorphologyFilter(int op, int type, InputArray kernel,
|
||||
Point anchor = Point(-1,-1));
|
||||
|
||||
//! returns morphological filter engine. Only MORPH_ERODE and MORPH_DILATE are supported.
|
||||
CV_EXPORTS Ptr<FilterEngine> createMorphologyFilter(int op, int type, InputArray kernel,
|
||||
Point anchor = Point(-1,-1), int rowBorderType = BORDER_CONSTANT,
|
||||
int columnBorderType = -1,
|
||||
const Scalar& borderValue = morphologyDefaultBorderValue());
|
||||
|
||||
static inline Point normalizeAnchor( Point anchor, Size ksize )
|
||||
{
|
||||
if( anchor.x == -1 )
|
||||
anchor.x = ksize.width/2;
|
||||
if( anchor.y == -1 )
|
||||
anchor.y = ksize.height/2;
|
||||
CV_Assert( anchor.inside(Rect(0, 0, ksize.width, ksize.height)) );
|
||||
return anchor;
|
||||
}
|
||||
|
||||
void preprocess2DKernel( const Mat& kernel, std::vector<Point>& coords, std::vector<uchar>& coeffs );
|
||||
void crossCorr( const Mat& src, const Mat& templ, Mat& dst,
|
||||
Size corrsize, int ctype,
|
||||
Point anchor=Point(0,0), double delta=0,
|
||||
int borderType=BORDER_REFLECT_101 );
|
||||
|
||||
}
|
||||
|
||||
#endif
|
3359
modules/imgproc/src/hershey_fonts.cpp
Normal file
3359
modules/imgproc/src/hershey_fonts.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -78,38 +78,6 @@ extern const float icv8x32fTab_cv[];
|
||||
extern const float icv8x32fSqrTab[];
|
||||
#define CV_8TO32F_SQR(x) icv8x32fSqrTab[(x)+128]
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
static inline Point normalizeAnchor( Point anchor, Size ksize )
|
||||
{
|
||||
if( anchor.x == -1 )
|
||||
anchor.x = ksize.width/2;
|
||||
if( anchor.y == -1 )
|
||||
anchor.y = ksize.height/2;
|
||||
CV_Assert( anchor.inside(Rect(0, 0, ksize.width, ksize.height)) );
|
||||
return anchor;
|
||||
}
|
||||
|
||||
void preprocess2DKernel( const Mat& kernel, std::vector<Point>& coords, std::vector<uchar>& coeffs );
|
||||
void crossCorr( const Mat& src, const Mat& templ, Mat& dst,
|
||||
Size corrsize, int ctype,
|
||||
Point anchor=Point(0,0), double delta=0,
|
||||
int borderType=BORDER_REFLECT_101 );
|
||||
|
||||
}
|
||||
|
||||
typedef struct CvPyramid
|
||||
{
|
||||
uchar **ptr;
|
||||
CvSize *sz;
|
||||
double *rate;
|
||||
int *step;
|
||||
uchar *state;
|
||||
int level;
|
||||
}
|
||||
CvPyramid;
|
||||
|
||||
#define CV_COPY( dst, src, len, idx ) \
|
||||
for( (idx) = 0; (idx) < (len); (idx)++) (dst)[idx] = (src)[idx]
|
||||
|
||||
@@ -123,5 +91,6 @@ CvPyramid;
|
||||
#define CV_CALC_MAX(a, b) if((a) < (b)) (a) = (b)
|
||||
|
||||
#include "_geom.h"
|
||||
#include "filterengine.hpp"
|
||||
|
||||
#endif /*__OPENCV_CV_INTERNAL_H_*/
|
||||
|
Reference in New Issue
Block a user