mirror of
https://github.com/opencv/opencv.git
synced 2025-01-18 06:03:15 +08:00
Remove deprecated methods from cv::Algorithm
This commit is contained in:
parent
fdf31ec14f
commit
da383e65e2
@ -122,7 +122,6 @@ CV_INLINE CvParamLattice cvDefaultParamLattice( void )
|
||||
#define CV_TYPE_NAME_ML_SVM "opencv-ml-svm"
|
||||
#define CV_TYPE_NAME_ML_KNN "opencv-ml-knn"
|
||||
#define CV_TYPE_NAME_ML_NBAYES "opencv-ml-bayesian"
|
||||
#define CV_TYPE_NAME_ML_EM "opencv-ml-em"
|
||||
#define CV_TYPE_NAME_ML_BOOSTING "opencv-ml-boost-tree"
|
||||
#define CV_TYPE_NAME_ML_TREE "opencv-ml-tree"
|
||||
#define CV_TYPE_NAME_ML_ANN_MLP "opencv-ml-ann-mlp"
|
||||
@ -562,100 +561,6 @@ private:
|
||||
CvSVM& operator = (const CvSVM&);
|
||||
};
|
||||
|
||||
/****************************************************************************************\
|
||||
* Expectation - Maximization *
|
||||
\****************************************************************************************/
|
||||
namespace cv
|
||||
{
|
||||
class EM : public Algorithm
|
||||
{
|
||||
public:
|
||||
// Type of covariation matrices
|
||||
enum {COV_MAT_SPHERICAL=0, COV_MAT_DIAGONAL=1, COV_MAT_GENERIC=2, COV_MAT_DEFAULT=COV_MAT_DIAGONAL};
|
||||
|
||||
// Default parameters
|
||||
enum {DEFAULT_NCLUSTERS=5, DEFAULT_MAX_ITERS=100};
|
||||
|
||||
// The initial step
|
||||
enum {START_E_STEP=1, START_M_STEP=2, START_AUTO_STEP=0};
|
||||
|
||||
CV_WRAP EM(int nclusters=EM::DEFAULT_NCLUSTERS, int covMatType=EM::COV_MAT_DIAGONAL,
|
||||
const TermCriteria& termCrit=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS,
|
||||
EM::DEFAULT_MAX_ITERS, FLT_EPSILON));
|
||||
|
||||
virtual ~EM();
|
||||
CV_WRAP virtual void clear();
|
||||
|
||||
CV_WRAP virtual bool train(InputArray samples,
|
||||
OutputArray logLikelihoods=noArray(),
|
||||
OutputArray labels=noArray(),
|
||||
OutputArray probs=noArray());
|
||||
|
||||
CV_WRAP virtual bool trainE(InputArray samples,
|
||||
InputArray means0,
|
||||
InputArray covs0=noArray(),
|
||||
InputArray weights0=noArray(),
|
||||
OutputArray logLikelihoods=noArray(),
|
||||
OutputArray labels=noArray(),
|
||||
OutputArray probs=noArray());
|
||||
|
||||
CV_WRAP virtual bool trainM(InputArray samples,
|
||||
InputArray probs0,
|
||||
OutputArray logLikelihoods=noArray(),
|
||||
OutputArray labels=noArray(),
|
||||
OutputArray probs=noArray());
|
||||
|
||||
CV_WRAP Vec2d predict(InputArray sample,
|
||||
OutputArray probs=noArray()) const;
|
||||
|
||||
CV_WRAP bool isTrained() const;
|
||||
|
||||
AlgorithmInfo* info() const;
|
||||
virtual void read(const FileNode& fn);
|
||||
|
||||
protected:
|
||||
|
||||
virtual void setTrainData(int startStep, const Mat& samples,
|
||||
const Mat* probs0,
|
||||
const Mat* means0,
|
||||
const std::vector<Mat>* covs0,
|
||||
const Mat* weights0);
|
||||
|
||||
bool doTrain(int startStep,
|
||||
OutputArray logLikelihoods,
|
||||
OutputArray labels,
|
||||
OutputArray probs);
|
||||
virtual void eStep();
|
||||
virtual void mStep();
|
||||
|
||||
void clusterTrainSamples();
|
||||
void decomposeCovs();
|
||||
void computeLogWeightDivDet();
|
||||
|
||||
Vec2d computeProbabilities(const Mat& sample, Mat* probs) const;
|
||||
|
||||
// all inner matrices have type CV_64FC1
|
||||
CV_PROP_RW int nclusters;
|
||||
CV_PROP_RW int covMatType;
|
||||
CV_PROP_RW int maxIters;
|
||||
CV_PROP_RW double epsilon;
|
||||
|
||||
Mat trainSamples;
|
||||
Mat trainProbs;
|
||||
Mat trainLogLikelihoods;
|
||||
Mat trainLabels;
|
||||
|
||||
CV_PROP Mat weights;
|
||||
CV_PROP Mat means;
|
||||
CV_PROP std::vector<Mat> covs;
|
||||
|
||||
std::vector<Mat> covsEigenValues;
|
||||
std::vector<Mat> covsRotateMats;
|
||||
std::vector<Mat> invCovsEigenValues;
|
||||
Mat logWeightDivDet;
|
||||
};
|
||||
} // namespace cv
|
||||
|
||||
/****************************************************************************************\
|
||||
* Decision Tree *
|
||||
\****************************************************************************************/\
|
||||
@ -2155,8 +2060,6 @@ typedef CvGBTreesParams GradientBoostingTreeParams;
|
||||
typedef CvGBTrees GradientBoostingTrees;
|
||||
|
||||
template<> void DefaultDeleter<CvDTreeSplit>::operator ()(CvDTreeSplit* obj) const;
|
||||
|
||||
bool initModule_ml(void);
|
||||
}
|
||||
|
||||
#endif // __cplusplus
|
||||
|
@ -100,7 +100,7 @@ RECURSIVE = YES
|
||||
EXCLUDE =
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
EXCLUDE_PATTERNS = *.inl.hpp *.impl.hpp *_detail.hpp */cudev/**/detail/*.hpp
|
||||
EXCLUDE_SYMBOLS = cv::DataType<*> int
|
||||
EXCLUDE_SYMBOLS = cv::DataType<*> int void
|
||||
EXAMPLE_PATH = @CMAKE_DOXYGEN_EXAMPLE_PATH@
|
||||
EXAMPLE_PATTERNS = *
|
||||
EXAMPLE_RECURSIVE = YES
|
||||
@ -243,7 +243,8 @@ PREDEFINED = __cplusplus=1 \
|
||||
CV_NORETURN= \
|
||||
CV_DEFAULT(x)=" = x" \
|
||||
CV_NEON=1 \
|
||||
FLANN_DEPRECATED=
|
||||
FLANN_DEPRECATED= \
|
||||
"CV_PURE_PROPERTY(type, name)= /**\@{*/ virtual type get##name() const = 0; virtual void set##name(type _##name) = 0; /**\@}*/"
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
TAGFILES =
|
||||
|
@ -200,8 +200,6 @@ public:
|
||||
|
||||
void setCallback(const Ptr<LMSolver::Callback>& _cb) { cb = _cb; }
|
||||
|
||||
AlgorithmInfo* info() const;
|
||||
|
||||
Ptr<LMSolver::Callback> cb;
|
||||
|
||||
double epsx;
|
||||
@ -211,15 +209,8 @@ public:
|
||||
};
|
||||
|
||||
|
||||
CV_INIT_ALGORITHM(LMSolverImpl, "LMSolver",
|
||||
obj.info()->addParam(obj, "epsx", obj.epsx);
|
||||
obj.info()->addParam(obj, "epsf", obj.epsf);
|
||||
obj.info()->addParam(obj, "maxIters", obj.maxIters);
|
||||
obj.info()->addParam(obj, "printInterval", obj.printInterval))
|
||||
|
||||
Ptr<LMSolver> createLMSolver(const Ptr<LMSolver::Callback>& cb, int maxIters)
|
||||
{
|
||||
CV_Assert( !LMSolverImpl_info_auto.name().empty() );
|
||||
return makePtr<LMSolverImpl>(cb, maxIters);
|
||||
}
|
||||
|
||||
|
@ -256,8 +256,6 @@ public:
|
||||
|
||||
void setCallback(const Ptr<PointSetRegistrator::Callback>& _cb) { cb = _cb; }
|
||||
|
||||
AlgorithmInfo* info() const;
|
||||
|
||||
Ptr<PointSetRegistrator::Callback> cb;
|
||||
int modelPoints;
|
||||
bool checkPartialSubsets;
|
||||
@ -378,25 +376,12 @@ public:
|
||||
return result;
|
||||
}
|
||||
|
||||
AlgorithmInfo* info() const;
|
||||
};
|
||||
|
||||
|
||||
CV_INIT_ALGORITHM(RANSACPointSetRegistrator, "PointSetRegistrator.RANSAC",
|
||||
obj.info()->addParam(obj, "threshold", obj.threshold);
|
||||
obj.info()->addParam(obj, "confidence", obj.confidence);
|
||||
obj.info()->addParam(obj, "maxIters", obj.maxIters))
|
||||
|
||||
CV_INIT_ALGORITHM(LMeDSPointSetRegistrator, "PointSetRegistrator.LMeDS",
|
||||
obj.info()->addParam(obj, "confidence", obj.confidence);
|
||||
obj.info()->addParam(obj, "maxIters", obj.maxIters))
|
||||
|
||||
|
||||
Ptr<PointSetRegistrator> createRANSACPointSetRegistrator(const Ptr<PointSetRegistrator::Callback>& _cb,
|
||||
int _modelPoints, double _threshold,
|
||||
double _confidence, int _maxIters)
|
||||
{
|
||||
CV_Assert( !RANSACPointSetRegistrator_info_auto.name().empty() );
|
||||
return Ptr<PointSetRegistrator>(
|
||||
new RANSACPointSetRegistrator(_cb, _modelPoints, _threshold, _confidence, _maxIters));
|
||||
}
|
||||
@ -405,7 +390,6 @@ Ptr<PointSetRegistrator> createRANSACPointSetRegistrator(const Ptr<PointSetRegis
|
||||
Ptr<PointSetRegistrator> createLMeDSPointSetRegistrator(const Ptr<PointSetRegistrator::Callback>& _cb,
|
||||
int _modelPoints, double _confidence, int _maxIters)
|
||||
{
|
||||
CV_Assert( !LMeDSPointSetRegistrator_info_auto.name().empty() );
|
||||
return Ptr<PointSetRegistrator>(
|
||||
new LMeDSPointSetRegistrator(_cb, _modelPoints, _confidence, _maxIters));
|
||||
}
|
||||
|
@ -1010,8 +1010,6 @@ public:
|
||||
disp.convertTo(disp0, disp0.type(), 1./(1 << DISPARITY_SHIFT), 0);
|
||||
}
|
||||
|
||||
AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
int getMinDisparity() const { return params.minDisparity; }
|
||||
void setMinDisparity(int minDisparity) { params.minDisparity = minDisparity; }
|
||||
|
||||
|
@ -865,8 +865,6 @@ public:
|
||||
StereoMatcher::DISP_SCALE*params.speckleRange, buffer);
|
||||
}
|
||||
|
||||
AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
int getMinDisparity() const { return params.minDisparity; }
|
||||
void setMinDisparity(int minDisparity) { params.minDisparity = minDisparity; }
|
||||
|
||||
|
@ -2745,8 +2745,6 @@ public:
|
||||
//////////////////////////////////////// Algorithm ////////////////////////////////////
|
||||
|
||||
class CV_EXPORTS Algorithm;
|
||||
class CV_EXPORTS AlgorithmInfo;
|
||||
struct CV_EXPORTS AlgorithmInfoData;
|
||||
|
||||
template<typename _Tp> struct ParamType {};
|
||||
|
||||
@ -2759,32 +2757,13 @@ matching, graph-cut etc.), background subtraction (which can be done using mixtu
|
||||
models, codebook-based algorithm etc.), optical flow (block matching, Lucas-Kanade, Horn-Schunck
|
||||
etc.).
|
||||
|
||||
The class provides the following features for all derived classes:
|
||||
|
||||
- so called "virtual constructor". That is, each Algorithm derivative is registered at program
|
||||
start and you can get the list of registered algorithms and create instance of a particular
|
||||
algorithm by its name (see Algorithm::create). If you plan to add your own algorithms, it is
|
||||
good practice to add a unique prefix to your algorithms to distinguish them from other
|
||||
algorithms.
|
||||
- setting/retrieving algorithm parameters by name. If you used video capturing functionality
|
||||
from OpenCV videoio module, you are probably familar with cvSetCaptureProperty(),
|
||||
cvGetCaptureProperty(), VideoCapture::set() and VideoCapture::get(). Algorithm provides
|
||||
similar method where instead of integer id's you specify the parameter names as text strings.
|
||||
See Algorithm::set and Algorithm::get for details.
|
||||
- reading and writing parameters from/to XML or YAML files. Every Algorithm derivative can store
|
||||
all its parameters and then read them back. There is no need to re-implement it each time.
|
||||
|
||||
Here is example of SIFT use in your application via Algorithm interface:
|
||||
@code
|
||||
#include "opencv2/opencv.hpp"
|
||||
#include "opencv2/xfeatures2d.hpp"
|
||||
|
||||
using namespace cv::xfeatures2d;
|
||||
|
||||
...
|
||||
|
||||
Ptr<Feature2D> sift = SIFT::create();
|
||||
|
||||
FileStorage fs("sift_params.xml", FileStorage::READ);
|
||||
if( fs.isOpened() ) // if we have file with parameters, read them
|
||||
{
|
||||
@ -2794,323 +2773,80 @@ Here is example of SIFT use in your application via Algorithm interface:
|
||||
else // else modify the parameters and store them; user can later edit the file to use different parameters
|
||||
{
|
||||
sift->setContrastThreshold(0.01f); // lower the contrast threshold, compared to the default value
|
||||
|
||||
{
|
||||
WriteStructContext ws(fs, "sift_params", CV_NODE_MAP);
|
||||
sift->write(fs);
|
||||
WriteStructContext ws(fs, "sift_params", CV_NODE_MAP);
|
||||
sift->write(fs);
|
||||
}
|
||||
}
|
||||
|
||||
Mat image = imread("myimage.png", 0), descriptors;
|
||||
vector<KeyPoint> keypoints;
|
||||
sift->detectAndCompute(image, noArray(), keypoints, descriptors);
|
||||
@endcode
|
||||
|
||||
Creating Own Algorithms
|
||||
-----------------------
|
||||
If you want to make your own algorithm, derived from Algorithm, you should basically follow a few
|
||||
conventions and add a little semi-standard piece of code to your class:
|
||||
- Make a class and specify Algorithm as its base class.
|
||||
- The algorithm parameters should be the class members. See Algorithm::get() for the list of
|
||||
possible types of the parameters.
|
||||
- Add public virtual method `AlgorithmInfo* info() const;` to your class.
|
||||
- Add constructor function, AlgorithmInfo instance and implement the info() method. The simplest
|
||||
way is to take <https://github.com/Itseez/opencv/tree/master/modules/ml/src/ml_init.cpp> as
|
||||
the reference and modify it according to the list of your parameters.
|
||||
- Add some public function (e.g. `initModule_<mymodule>()`) that calls info() of your algorithm
|
||||
and put it into the same source file as info() implementation. This is to force C++ linker to
|
||||
include this object file into the target application. See Algorithm::create() for details.
|
||||
*/
|
||||
class CV_EXPORTS_W Algorithm
|
||||
{
|
||||
public:
|
||||
Algorithm();
|
||||
virtual ~Algorithm();
|
||||
/**Returns the algorithm name*/
|
||||
String name() const;
|
||||
|
||||
/** @brief returns the algorithm parameter
|
||||
|
||||
The method returns value of the particular parameter. Since the compiler can not deduce the
|
||||
type of the returned parameter, you should specify it explicitly in angle brackets. Here are
|
||||
the allowed forms of get:
|
||||
|
||||
- myalgo.get\<int\>("param_name")
|
||||
- myalgo.get\<double\>("param_name")
|
||||
- myalgo.get\<bool\>("param_name")
|
||||
- myalgo.get\<String\>("param_name")
|
||||
- myalgo.get\<Mat\>("param_name")
|
||||
- myalgo.get\<vector\<Mat\> \>("param_name")
|
||||
- myalgo.get\<Algorithm\>("param_name") (it returns Ptr\<Algorithm\>).
|
||||
|
||||
In some cases the actual type of the parameter can be cast to the specified type, e.g. integer
|
||||
parameter can be cast to double, bool can be cast to int. But "dangerous" transformations
|
||||
(string\<-\>number, double-\>int, 1x1 Mat\<-\>number, ...) are not performed and the method
|
||||
will throw an exception. In the case of Mat or vector\<Mat\> parameters the method does not
|
||||
clone the matrix data, so do not modify the matrices. Use Algorithm::set instead - slower, but
|
||||
more safe.
|
||||
@param name The parameter name.
|
||||
*/
|
||||
template<typename _Tp> typename ParamType<_Tp>::member_type get(const String& name) const;
|
||||
/** @overload */
|
||||
template<typename _Tp> typename ParamType<_Tp>::member_type get(const char* name) const;
|
||||
|
||||
CV_WRAP int getInt(const String& name) const;
|
||||
CV_WRAP double getDouble(const String& name) const;
|
||||
CV_WRAP bool getBool(const String& name) const;
|
||||
CV_WRAP String getString(const String& name) const;
|
||||
CV_WRAP Mat getMat(const String& name) const;
|
||||
CV_WRAP std::vector<Mat> getMatVector(const String& name) const;
|
||||
CV_WRAP Ptr<Algorithm> getAlgorithm(const String& name) const;
|
||||
|
||||
/** @brief Sets the algorithm parameter
|
||||
|
||||
The method sets value of the particular parameter. Some of the algorithm
|
||||
parameters may be declared as read-only. If you try to set such a
|
||||
parameter, you will get exception with the corresponding error message.
|
||||
@param name The parameter name.
|
||||
@param value The parameter value.
|
||||
*/
|
||||
void set(const String& name, int value);
|
||||
void set(const String& name, double value);
|
||||
void set(const String& name, bool value);
|
||||
void set(const String& name, const String& value);
|
||||
void set(const String& name, const Mat& value);
|
||||
void set(const String& name, const std::vector<Mat>& value);
|
||||
void set(const String& name, const Ptr<Algorithm>& value);
|
||||
template<typename _Tp> void set(const String& name, const Ptr<_Tp>& value);
|
||||
|
||||
CV_WRAP void setInt(const String& name, int value);
|
||||
CV_WRAP void setDouble(const String& name, double value);
|
||||
CV_WRAP void setBool(const String& name, bool value);
|
||||
CV_WRAP void setString(const String& name, const String& value);
|
||||
CV_WRAP void setMat(const String& name, const Mat& value);
|
||||
CV_WRAP void setMatVector(const String& name, const std::vector<Mat>& value);
|
||||
CV_WRAP void setAlgorithm(const String& name, const Ptr<Algorithm>& value);
|
||||
template<typename _Tp> void setAlgorithm(const String& name, const Ptr<_Tp>& value);
|
||||
|
||||
void set(const char* name, int value);
|
||||
void set(const char* name, double value);
|
||||
void set(const char* name, bool value);
|
||||
void set(const char* name, const String& value);
|
||||
void set(const char* name, const Mat& value);
|
||||
void set(const char* name, const std::vector<Mat>& value);
|
||||
void set(const char* name, const Ptr<Algorithm>& value);
|
||||
template<typename _Tp> void set(const char* name, const Ptr<_Tp>& value);
|
||||
|
||||
void setInt(const char* name, int value);
|
||||
void setDouble(const char* name, double value);
|
||||
void setBool(const char* name, bool value);
|
||||
void setString(const char* name, const String& value);
|
||||
void setMat(const char* name, const Mat& value);
|
||||
void setMatVector(const char* name, const std::vector<Mat>& value);
|
||||
void setAlgorithm(const char* name, const Ptr<Algorithm>& value);
|
||||
template<typename _Tp> void setAlgorithm(const char* name, const Ptr<_Tp>& value);
|
||||
|
||||
CV_WRAP String paramHelp(const String& name) const;
|
||||
int paramType(const char* name) const;
|
||||
CV_WRAP int paramType(const String& name) const;
|
||||
CV_WRAP void getParams(CV_OUT std::vector<String>& names) const;
|
||||
|
||||
/** @brief Stores algorithm parameters in a file storage
|
||||
|
||||
The method stores all the algorithm parameters (in alphabetic order) to
|
||||
the file storage. The method is virtual. If you define your own
|
||||
Algorithm derivative, your can override the method and store some extra
|
||||
information. However, it's rarely needed. Here are some examples:
|
||||
- SIFT feature detector (from xfeatures2d module). The class only
|
||||
stores algorithm parameters and no keypoints or their descriptors.
|
||||
Therefore, it's enough to store the algorithm parameters, which is
|
||||
what Algorithm::write() does. Therefore, there is no dedicated
|
||||
SIFT::write().
|
||||
- Background subtractor (from video module). It has the algorithm
|
||||
parameters and also it has the current background model. However,
|
||||
the background model is not stored. First, it's rather big. Then,
|
||||
if you have stored the background model, it would likely become
|
||||
irrelevant on the next run (because of shifted camera, changed
|
||||
background, different lighting etc.). Therefore,
|
||||
BackgroundSubtractorMOG and BackgroundSubtractorMOG2 also rely on
|
||||
the standard Algorithm::write() to store just the algorithm
|
||||
parameters.
|
||||
- Expectation Maximization (from ml module). The algorithm finds
|
||||
mixture of gaussians that approximates user data best of all. In
|
||||
this case the model may be re-used on the next run to test new
|
||||
data against the trained statistical model. So EM needs to store
|
||||
the model. However, since the model is described by a few
|
||||
parameters that are available as read-only algorithm parameters
|
||||
(i.e. they are available via EM::get()), EM also relies on
|
||||
Algorithm::write() to store both EM parameters and the model
|
||||
(represented by read-only algorithm parameters).
|
||||
@param fs File storage.
|
||||
*/
|
||||
virtual void write(FileStorage& fs) const;
|
||||
|
||||
/** @brief Reads algorithm parameters from a file storage
|
||||
|
||||
The method reads all the algorithm parameters from the specified node of
|
||||
a file storage. Similarly to Algorithm::write(), if you implement an
|
||||
algorithm that needs to read some extra data and/or re-compute some
|
||||
internal data, you may override the method.
|
||||
@param fn File node of the file storage.
|
||||
*/
|
||||
virtual void read(const FileNode& fn);
|
||||
|
||||
typedef Algorithm* (*Constructor)(void);
|
||||
typedef int (Algorithm::*Getter)() const;
|
||||
typedef void (Algorithm::*Setter)(int);
|
||||
|
||||
/** @brief Returns the list of registered algorithms
|
||||
|
||||
This static method returns the list of registered algorithms in
|
||||
alphabetical order. Here is how to use it :
|
||||
@code{.cpp}
|
||||
vector<String> algorithms;
|
||||
Algorithm::getList(algorithms);
|
||||
cout << "Algorithms: " << algorithms.size() << endl;
|
||||
for (size_t i=0; i < algorithms.size(); i++)
|
||||
cout << algorithms[i] << endl;
|
||||
@endcode
|
||||
@param algorithms The output vector of algorithm names.
|
||||
*/
|
||||
CV_WRAP static void getList(CV_OUT std::vector<String>& algorithms);
|
||||
CV_WRAP static Ptr<Algorithm> _create(const String& name);
|
||||
|
||||
/** @brief Creates algorithm instance by name
|
||||
|
||||
This static method creates a new instance of the specified algorithm. If
|
||||
there is no such algorithm, the method will silently return a null
|
||||
pointer. Also, you should specify the particular Algorithm subclass as
|
||||
_Tp (or simply Algorithm if you do not know it at that point). :
|
||||
@code{.cpp}
|
||||
Ptr<BackgroundSubtractor> bgfg = Algorithm::create<BackgroundSubtractor>("BackgroundSubtractor.MOG2");
|
||||
@endcode
|
||||
@note This is important note about seemingly mysterious behavior of
|
||||
Algorithm::create() when it returns NULL while it should not. The reason
|
||||
is simple - Algorithm::create() resides in OpenCV's core module and the
|
||||
algorithms are implemented in other modules. If you create algorithms
|
||||
dynamically, C++ linker may decide to throw away the modules where the
|
||||
actual algorithms are implemented, since you do not call any functions
|
||||
from the modules. To avoid this problem, you need to call
|
||||
initModule_\<modulename\>(); somewhere in the beginning of the program
|
||||
before Algorithm::create(). For example, call initModule_xfeatures2d()
|
||||
in order to use SURF/SIFT, call initModule_ml() to use expectation
|
||||
maximization etc.
|
||||
@param name The algorithm name, one of the names returned by Algorithm::getList().
|
||||
*/
|
||||
template<typename _Tp> static Ptr<_Tp> create(const String& name);
|
||||
|
||||
virtual AlgorithmInfo* info() const /* TODO: make it = 0;*/ { return 0; }
|
||||
};
|
||||
|
||||
/** @todo document */
|
||||
class CV_EXPORTS AlgorithmInfo
|
||||
{
|
||||
public:
|
||||
friend class Algorithm;
|
||||
AlgorithmInfo(const String& name, Algorithm::Constructor create);
|
||||
~AlgorithmInfo();
|
||||
void get(const Algorithm* algo, const char* name, int argType, void* value) const;
|
||||
void addParam_(Algorithm& algo, const char* name, int argType,
|
||||
void* value, bool readOnly,
|
||||
Algorithm::Getter getter, Algorithm::Setter setter,
|
||||
const String& help=String());
|
||||
String paramHelp(const char* name) const;
|
||||
int paramType(const char* name) const;
|
||||
void getParams(std::vector<String>& names) const;
|
||||
Algorithm();
|
||||
virtual ~Algorithm();
|
||||
|
||||
void write(const Algorithm* algo, FileStorage& fs) const;
|
||||
void read(Algorithm* algo, const FileNode& fn) const;
|
||||
String name() const;
|
||||
/** @brief Stores algorithm parameters in a file storage
|
||||
*/
|
||||
virtual void write(FileStorage& fs) const { (void)fs; }
|
||||
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
int& value, bool readOnly=false,
|
||||
int (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(int)=0,
|
||||
const String& help=String());
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
bool& value, bool readOnly=false,
|
||||
int (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(int)=0,
|
||||
const String& help=String());
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
double& value, bool readOnly=false,
|
||||
double (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(double)=0,
|
||||
const String& help=String());
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
String& value, bool readOnly=false,
|
||||
String (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(const String&)=0,
|
||||
const String& help=String());
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
Mat& value, bool readOnly=false,
|
||||
Mat (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(const Mat&)=0,
|
||||
const String& help=String());
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
std::vector<Mat>& value, bool readOnly=false,
|
||||
std::vector<Mat> (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(const std::vector<Mat>&)=0,
|
||||
const String& help=String());
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
Ptr<Algorithm>& value, bool readOnly=false,
|
||||
Ptr<Algorithm> (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(const Ptr<Algorithm>&)=0,
|
||||
const String& help=String());
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
float& value, bool readOnly=false,
|
||||
float (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(float)=0,
|
||||
const String& help=String());
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
unsigned int& value, bool readOnly=false,
|
||||
unsigned int (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(unsigned int)=0,
|
||||
const String& help=String());
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
uint64& value, bool readOnly=false,
|
||||
uint64 (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(uint64)=0,
|
||||
const String& help=String());
|
||||
void addParam(Algorithm& algo, const char* name,
|
||||
uchar& value, bool readOnly=false,
|
||||
uchar (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(uchar)=0,
|
||||
const String& help=String());
|
||||
template<typename _Tp, typename _Base> void addParam(Algorithm& algo, const char* name,
|
||||
Ptr<_Tp>& value, bool readOnly=false,
|
||||
Ptr<_Tp> (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(const Ptr<_Tp>&)=0,
|
||||
const String& help=String());
|
||||
template<typename _Tp> void addParam(Algorithm& algo, const char* name,
|
||||
Ptr<_Tp>& value, bool readOnly=false,
|
||||
Ptr<_Tp> (Algorithm::*getter)()=0,
|
||||
void (Algorithm::*setter)(const Ptr<_Tp>&)=0,
|
||||
const String& help=String());
|
||||
protected:
|
||||
AlgorithmInfoData* data;
|
||||
void set(Algorithm* algo, const char* name, int argType,
|
||||
const void* value, bool force=false) const;
|
||||
/** @brief Reads algorithm parameters from a file storage
|
||||
*/
|
||||
virtual void read(const FileNode& fn) { (void)fn; }
|
||||
};
|
||||
|
||||
/** @todo document */
|
||||
struct CV_EXPORTS Param
|
||||
{
|
||||
enum { INT=0, BOOLEAN=1, REAL=2, STRING=3, MAT=4, MAT_VECTOR=5, ALGORITHM=6, FLOAT=7, UNSIGNED_INT=8, UINT64=9, UCHAR=11 };
|
||||
// define properties
|
||||
|
||||
Param();
|
||||
Param(int _type, bool _readonly, int _offset,
|
||||
Algorithm::Getter _getter=0,
|
||||
Algorithm::Setter _setter=0,
|
||||
const String& _help=String());
|
||||
int type;
|
||||
int offset;
|
||||
bool readonly;
|
||||
Algorithm::Getter getter;
|
||||
Algorithm::Setter setter;
|
||||
String help;
|
||||
#define CV_PURE_PROPERTY(type, name) \
|
||||
CV_WRAP virtual type get##name() const = 0; \
|
||||
CV_WRAP virtual void set##name(type _##name) = 0;
|
||||
|
||||
#define CV_PURE_PROPERTY_S(type, name) \
|
||||
CV_WRAP virtual type get##name() const = 0; \
|
||||
CV_WRAP virtual void set##name(const type & _##name) = 0;
|
||||
|
||||
#define CV_PURE_PROPERTY_RO(type, name) \
|
||||
CV_WRAP virtual type get##name() const = 0;
|
||||
|
||||
// basic property implementation
|
||||
|
||||
#define CV_IMPL_PROPERTY(type, name, member) \
|
||||
type get##name() const \
|
||||
{ \
|
||||
return member; \
|
||||
} \
|
||||
void set##name(type val) \
|
||||
{ \
|
||||
member = val; \
|
||||
}
|
||||
|
||||
#define CV_IMPL_PROPERTY_S(type, name, member) \
|
||||
type get##name() const \
|
||||
{ \
|
||||
return member; \
|
||||
} \
|
||||
void set##name(const type &val) \
|
||||
{ \
|
||||
member = val; \
|
||||
}
|
||||
|
||||
#define CV_IMPL_PROPERTY_RO(type, name, member) \
|
||||
type get##name() const \
|
||||
{ \
|
||||
return member; \
|
||||
}
|
||||
|
||||
|
||||
struct Param {
|
||||
enum { INT=0, BOOLEAN=1, REAL=2, STRING=3, MAT=4, MAT_VECTOR=5, ALGORITHM=6, FLOAT=7,
|
||||
UNSIGNED_INT=8, UINT64=9, UCHAR=11 };
|
||||
};
|
||||
|
||||
|
||||
|
||||
template<> struct ParamType<bool>
|
||||
{
|
||||
typedef bool const_param_type;
|
||||
|
@ -412,84 +412,6 @@ int print(const Matx<_Tp, m, n>& matx, FILE* stream = stdout)
|
||||
return print(Formatter::get()->format(cv::Mat(matx)), stream);
|
||||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////// Algorithm //////////////////////////////////////////
|
||||
|
||||
template<typename _Tp> inline
|
||||
Ptr<_Tp> Algorithm::create(const String& name)
|
||||
{
|
||||
return _create(name).dynamicCast<_Tp>();
|
||||
}
|
||||
|
||||
template<typename _Tp> inline
|
||||
void Algorithm::set(const char* _name, const Ptr<_Tp>& value)
|
||||
{
|
||||
Ptr<Algorithm> algo_ptr = value. template dynamicCast<cv::Algorithm>();
|
||||
if (!algo_ptr) {
|
||||
CV_Error( Error::StsUnsupportedFormat, "unknown/unsupported Ptr type of the second parameter of the method Algorithm::set");
|
||||
}
|
||||
info()->set(this, _name, ParamType<Algorithm>::type, &algo_ptr);
|
||||
}
|
||||
|
||||
template<typename _Tp> inline
|
||||
void Algorithm::set(const String& _name, const Ptr<_Tp>& value)
|
||||
{
|
||||
this->set<_Tp>(_name.c_str(), value);
|
||||
}
|
||||
|
||||
template<typename _Tp> inline
|
||||
void Algorithm::setAlgorithm(const char* _name, const Ptr<_Tp>& value)
|
||||
{
|
||||
Ptr<Algorithm> algo_ptr = value. template ptr<cv::Algorithm>();
|
||||
if (!algo_ptr) {
|
||||
CV_Error( Error::StsUnsupportedFormat, "unknown/unsupported Ptr type of the second parameter of the method Algorithm::set");
|
||||
}
|
||||
info()->set(this, _name, ParamType<Algorithm>::type, &algo_ptr);
|
||||
}
|
||||
|
||||
template<typename _Tp> inline
|
||||
void Algorithm::setAlgorithm(const String& _name, const Ptr<_Tp>& value)
|
||||
{
|
||||
this->set<_Tp>(_name.c_str(), value);
|
||||
}
|
||||
|
||||
template<typename _Tp> inline
|
||||
typename ParamType<_Tp>::member_type Algorithm::get(const String& _name) const
|
||||
{
|
||||
typename ParamType<_Tp>::member_type value;
|
||||
info()->get(this, _name.c_str(), ParamType<_Tp>::type, &value);
|
||||
return value;
|
||||
}
|
||||
|
||||
template<typename _Tp> inline
|
||||
typename ParamType<_Tp>::member_type Algorithm::get(const char* _name) const
|
||||
{
|
||||
typename ParamType<_Tp>::member_type value;
|
||||
info()->get(this, _name, ParamType<_Tp>::type, &value);
|
||||
return value;
|
||||
}
|
||||
|
||||
template<typename _Tp, typename _Base> inline
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* parameter, Ptr<_Tp>& value, bool readOnly,
|
||||
Ptr<_Tp> (Algorithm::*getter)(), void (Algorithm::*setter)(const Ptr<_Tp>&),
|
||||
const String& help)
|
||||
{
|
||||
//TODO: static assert: _Tp inherits from _Base
|
||||
addParam_(algo, parameter, ParamType<_Base>::type, &value, readOnly,
|
||||
(Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
|
||||
}
|
||||
|
||||
template<typename _Tp> inline
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* parameter, Ptr<_Tp>& value, bool readOnly,
|
||||
Ptr<_Tp> (Algorithm::*getter)(), void (Algorithm::*setter)(const Ptr<_Tp>&),
|
||||
const String& help)
|
||||
{
|
||||
//TODO: static assert: _Tp inherits from Algorithm
|
||||
addParam_(algo, parameter, ParamType<Algorithm>::type, &value, readOnly,
|
||||
(Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
|
||||
}
|
||||
|
||||
//! @endcond
|
||||
|
||||
/****************************************************************************************\
|
||||
|
@ -129,40 +129,6 @@ namespace cv
|
||||
CV_EXPORTS const char* currentParallelFramework();
|
||||
} //namespace cv
|
||||
|
||||
#define CV_INIT_ALGORITHM(classname, algname, memberinit) \
|
||||
static inline ::cv::Algorithm* create##classname##_hidden() \
|
||||
{ \
|
||||
return new classname; \
|
||||
} \
|
||||
\
|
||||
static inline ::cv::Ptr< ::cv::Algorithm> create##classname##_ptr_hidden() \
|
||||
{ \
|
||||
return ::cv::makePtr<classname>(); \
|
||||
} \
|
||||
\
|
||||
static inline ::cv::AlgorithmInfo& classname##_info() \
|
||||
{ \
|
||||
static ::cv::AlgorithmInfo classname##_info_var(algname, create##classname##_hidden); \
|
||||
return classname##_info_var; \
|
||||
} \
|
||||
\
|
||||
static ::cv::AlgorithmInfo& classname##_info_auto = classname##_info(); \
|
||||
\
|
||||
::cv::AlgorithmInfo* classname::info() const \
|
||||
{ \
|
||||
static volatile bool initialized = false; \
|
||||
\
|
||||
if( !initialized ) \
|
||||
{ \
|
||||
initialized = true; \
|
||||
classname obj; \
|
||||
memberinit; \
|
||||
} \
|
||||
return &classname##_info(); \
|
||||
}
|
||||
|
||||
|
||||
|
||||
/****************************************************************************************\
|
||||
* Common declarations *
|
||||
\****************************************************************************************/
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -140,8 +140,6 @@ namespace
|
||||
public:
|
||||
CLAHE_Impl(double clipLimit = 40.0, int tilesX = 8, int tilesY = 8);
|
||||
|
||||
cv::AlgorithmInfo* info() const;
|
||||
|
||||
void apply(cv::InputArray src, cv::OutputArray dst);
|
||||
void apply(InputArray src, OutputArray dst, Stream& stream);
|
||||
|
||||
@ -167,11 +165,6 @@ namespace
|
||||
{
|
||||
}
|
||||
|
||||
CV_INIT_ALGORITHM(CLAHE_Impl, "CLAHE_CUDA",
|
||||
obj.info()->addParam(obj, "clipLimit", obj.clipLimit_);
|
||||
obj.info()->addParam(obj, "tilesX", obj.tilesX_);
|
||||
obj.info()->addParam(obj, "tilesY", obj.tilesY_))
|
||||
|
||||
void CLAHE_Impl::apply(cv::InputArray _src, cv::OutputArray _dst)
|
||||
{
|
||||
apply(_src, _dst, Stream::Null());
|
||||
|
@ -310,10 +310,10 @@ PERF_TEST_P(ImagePair, OpticalFlowDual_TVL1,
|
||||
{
|
||||
cv::Mat flow;
|
||||
|
||||
cv::Ptr<cv::DenseOpticalFlow> alg = cv::createOptFlow_DualTVL1();
|
||||
alg->set("medianFiltering", 1);
|
||||
alg->set("innerIterations", 1);
|
||||
alg->set("outerIterations", 300);
|
||||
cv::Ptr<cv::DualTVL1OpticalFlow> alg = cv::createOptFlow_DualTVL1();
|
||||
alg->setMedianFiltering(1);
|
||||
alg->setInnerIterations(1);
|
||||
alg->setOuterIterations(300);
|
||||
TEST_CYCLE() alg->calc(frame0, frame1, flow);
|
||||
|
||||
CPU_SANITY_CHECK(flow);
|
||||
|
@ -369,11 +369,11 @@ CUDA_TEST_P(OpticalFlowDual_TVL1, Accuracy)
|
||||
cv::cuda::GpuMat d_flow;
|
||||
d_alg->calc(loadMat(frame0), loadMat(frame1), d_flow);
|
||||
|
||||
cv::Ptr<cv::DenseOpticalFlow> alg = cv::createOptFlow_DualTVL1();
|
||||
alg->set("medianFiltering", 1);
|
||||
alg->set("innerIterations", 1);
|
||||
alg->set("outerIterations", d_alg->getNumIterations());
|
||||
alg->set("gamma", gamma);
|
||||
cv::Ptr<cv::DualTVL1OpticalFlow> alg = cv::createOptFlow_DualTVL1();
|
||||
alg->setMedianFiltering(1);
|
||||
alg->setInnerIterations(1);
|
||||
alg->setOuterIterations(d_alg->getNumIterations());
|
||||
alg->setGamma(gamma);
|
||||
|
||||
cv::Mat flow;
|
||||
alg->calc(frame0, frame1, flow);
|
||||
|
@ -320,8 +320,6 @@ namespace
|
||||
public:
|
||||
CLAHE_Impl(double clipLimit = 40.0, int tilesX = 8, int tilesY = 8);
|
||||
|
||||
cv::AlgorithmInfo* info() const;
|
||||
|
||||
void apply(cv::InputArray src, cv::OutputArray dst);
|
||||
|
||||
void setClipLimit(double clipLimit);
|
||||
@ -351,11 +349,6 @@ namespace
|
||||
{
|
||||
}
|
||||
|
||||
CV_INIT_ALGORITHM(CLAHE_Impl, "CLAHE",
|
||||
obj.info()->addParam(obj, "clipLimit", obj.clipLimit_);
|
||||
obj.info()->addParam(obj, "tilesX", obj.tilesX_);
|
||||
obj.info()->addParam(obj, "tilesY", obj.tilesY_))
|
||||
|
||||
void CLAHE_Impl::apply(cv::InputArray _src, cv::OutputArray _dst)
|
||||
{
|
||||
CV_Assert( _src.type() == CV_8UC1 || _src.type() == CV_16UC1 );
|
||||
|
@ -52,11 +52,6 @@
|
||||
@defgroup shape Shape Distance and Matching
|
||||
*/
|
||||
|
||||
namespace cv
|
||||
{
|
||||
CV_EXPORTS bool initModule_shape();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* End of file. */
|
||||
|
@ -66,8 +66,6 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
//! the main operator
|
||||
virtual void estimateTransformation(InputArray transformingShape, InputArray targetShape, std::vector<DMatch> &matches);
|
||||
virtual float applyTransformation(InputArray input, OutputArray output=noArray());
|
||||
|
@ -60,8 +60,6 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
//! the main operator
|
||||
virtual float computeDistance(InputArray contour1, InputArray contour2);
|
||||
|
||||
|
@ -62,8 +62,6 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
//! the main operator
|
||||
virtual void buildCostMatrix(InputArray descriptors1, InputArray descriptors2, OutputArray costMatrix);
|
||||
|
||||
@ -189,8 +187,6 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
//! the main operator
|
||||
virtual void buildCostMatrix(InputArray descriptors1, InputArray descriptors2, OutputArray costMatrix);
|
||||
|
||||
@ -327,8 +323,6 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
//! the main operator
|
||||
virtual void buildCostMatrix(InputArray descriptors1, InputArray descriptors2, OutputArray costMatrix);
|
||||
|
||||
@ -445,8 +439,6 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
//! the main operator
|
||||
virtual void buildCostMatrix(InputArray descriptors1, InputArray descriptors2, OutputArray costMatrix);
|
||||
|
||||
|
@ -79,8 +79,6 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
//! the main operator
|
||||
virtual float computeDistance(InputArray contour1, InputArray contour2);
|
||||
|
||||
|
@ -68,8 +68,6 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
//! the main operators
|
||||
virtual void estimateTransformation(InputArray transformingShape, InputArray targetShape, std::vector<DMatch> &matches);
|
||||
virtual float applyTransformation(InputArray inPts, OutputArray output=noArray());
|
||||
|
@ -44,6 +44,7 @@
|
||||
#define __OPENCV_SUPERRES_HPP__
|
||||
|
||||
#include "opencv2/core.hpp"
|
||||
#include "opencv2/superres/optical_flow.hpp"
|
||||
|
||||
/**
|
||||
@defgroup superres Super Resolution
|
||||
@ -62,8 +63,6 @@ namespace cv
|
||||
//! @addtogroup superres
|
||||
//! @{
|
||||
|
||||
CV_EXPORTS bool initModule_superres();
|
||||
|
||||
class CV_EXPORTS FrameSource
|
||||
{
|
||||
public:
|
||||
@ -105,6 +104,36 @@ namespace cv
|
||||
*/
|
||||
virtual void collectGarbage();
|
||||
|
||||
//! @name Scale factor
|
||||
CV_PURE_PROPERTY(int, Scale)
|
||||
|
||||
//! @name Iterations count
|
||||
CV_PURE_PROPERTY(int, Iterations)
|
||||
|
||||
//! @name Asymptotic value of steepest descent method
|
||||
CV_PURE_PROPERTY(double, Tau)
|
||||
|
||||
//! @name Weight parameter to balance data term and smoothness term
|
||||
CV_PURE_PROPERTY(double, Labmda)
|
||||
|
||||
//! @name Parameter of spacial distribution in Bilateral-TV
|
||||
CV_PURE_PROPERTY(double, Alpha)
|
||||
|
||||
//! @name Kernel size of Bilateral-TV filter
|
||||
CV_PURE_PROPERTY(int, KernelSize)
|
||||
|
||||
//! @name Gaussian blur kernel size
|
||||
CV_PURE_PROPERTY(int, BlurKernelSize)
|
||||
|
||||
//! @name Gaussian blur sigma
|
||||
CV_PURE_PROPERTY(double, BlurSigma)
|
||||
|
||||
//! @name Radius of the temporal search area
|
||||
CV_PURE_PROPERTY(int, TemporalAreaRadius)
|
||||
|
||||
//! @name Dense optical flow algorithm
|
||||
CV_PURE_PROPERTY_S(Ptr<cv::superres::DenseOpticalFlowExt>, OpticalFlow)
|
||||
|
||||
protected:
|
||||
SuperResolution();
|
||||
|
||||
@ -139,7 +168,6 @@ namespace cv
|
||||
*/
|
||||
CV_EXPORTS Ptr<SuperResolution> createSuperResolution_BTVL1();
|
||||
CV_EXPORTS Ptr<SuperResolution> createSuperResolution_BTVL1_CUDA();
|
||||
CV_EXPORTS Ptr<SuperResolution> createSuperResolution_BTVL1_OCL();
|
||||
|
||||
//! @} superres
|
||||
|
||||
|
@ -60,20 +60,68 @@ namespace cv
|
||||
virtual void collectGarbage() = 0;
|
||||
};
|
||||
|
||||
CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_Farneback();
|
||||
CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_Farneback_CUDA();
|
||||
CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_Farneback_OCL();
|
||||
|
||||
CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_Simple();
|
||||
class CV_EXPORTS FarnebackOpticalFlow : public virtual DenseOpticalFlowExt
|
||||
{
|
||||
public:
|
||||
CV_PURE_PROPERTY(double, PyrScale)
|
||||
CV_PURE_PROPERTY(int, LevelsNumber)
|
||||
CV_PURE_PROPERTY(int, WindowSize)
|
||||
CV_PURE_PROPERTY(int, Iterations)
|
||||
CV_PURE_PROPERTY(int, PolyN)
|
||||
CV_PURE_PROPERTY(double, PolySigma)
|
||||
CV_PURE_PROPERTY(int, Flags)
|
||||
};
|
||||
CV_EXPORTS Ptr<FarnebackOpticalFlow> createOptFlow_Farneback();
|
||||
CV_EXPORTS Ptr<FarnebackOpticalFlow> createOptFlow_Farneback_CUDA();
|
||||
|
||||
CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_DualTVL1();
|
||||
CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_DualTVL1_CUDA();
|
||||
CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_DualTVL1_OCL();
|
||||
|
||||
CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_Brox_CUDA();
|
||||
// CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_Simple();
|
||||
|
||||
CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_PyrLK_CUDA();
|
||||
CV_EXPORTS Ptr<DenseOpticalFlowExt> createOptFlow_PyrLK_OCL();
|
||||
|
||||
class CV_EXPORTS DualTVL1OpticalFlow : public virtual DenseOpticalFlowExt
|
||||
{
|
||||
public:
|
||||
CV_PURE_PROPERTY(double, Tau)
|
||||
CV_PURE_PROPERTY(double, Lambda)
|
||||
CV_PURE_PROPERTY(double, Theta)
|
||||
CV_PURE_PROPERTY(int, ScalesNumber)
|
||||
CV_PURE_PROPERTY(int, WarpingsNumber)
|
||||
CV_PURE_PROPERTY(double, Epsilon)
|
||||
CV_PURE_PROPERTY(int, Iterations)
|
||||
CV_PURE_PROPERTY(bool, UseInitialFlow)
|
||||
};
|
||||
CV_EXPORTS Ptr<DualTVL1OpticalFlow> createOptFlow_DualTVL1();
|
||||
CV_EXPORTS Ptr<DualTVL1OpticalFlow> createOptFlow_DualTVL1_CUDA();
|
||||
|
||||
|
||||
class CV_EXPORTS BroxOpticalFlow : public virtual DenseOpticalFlowExt
|
||||
{
|
||||
public:
|
||||
//! @name Flow smoothness
|
||||
CV_PURE_PROPERTY(double, Alpha)
|
||||
//! @name Gradient constancy importance
|
||||
CV_PURE_PROPERTY(double, Gamma)
|
||||
//! @name Pyramid scale factor
|
||||
CV_PURE_PROPERTY(double, ScaleFactor)
|
||||
//! @name Number of lagged non-linearity iterations (inner loop)
|
||||
CV_PURE_PROPERTY(int, InnerIterations)
|
||||
//! @name Number of warping iterations (number of pyramid levels)
|
||||
CV_PURE_PROPERTY(int, OuterIterations)
|
||||
//! @name Number of linear system solver iterations
|
||||
CV_PURE_PROPERTY(int, SolverIterations)
|
||||
};
|
||||
CV_EXPORTS Ptr<BroxOpticalFlow> createOptFlow_Brox_CUDA();
|
||||
|
||||
|
||||
class PyrLKOpticalFlow : public virtual DenseOpticalFlowExt
|
||||
{
|
||||
public:
|
||||
CV_PURE_PROPERTY(int, WindowSize)
|
||||
CV_PURE_PROPERTY(int, MaxLevel)
|
||||
CV_PURE_PROPERTY(int, Iterations)
|
||||
};
|
||||
CV_EXPORTS Ptr<PyrLKOpticalFlow> createOptFlow_PyrLK_CUDA();
|
||||
|
||||
//! @}
|
||||
|
||||
|
@ -138,10 +138,10 @@ PERF_TEST_P(Size_MatType, SuperResolution_BTVL1,
|
||||
{
|
||||
Ptr<SuperResolution> superRes = createSuperResolution_BTVL1_CUDA();
|
||||
|
||||
superRes->set("scale", scale);
|
||||
superRes->set("iterations", iterations);
|
||||
superRes->set("temporalAreaRadius", temporalAreaRadius);
|
||||
superRes->set("opticalFlow", opticalFlow);
|
||||
superRes->setScale(scale);
|
||||
superRes->setIterations(iterations);
|
||||
superRes->setTemporalAreaRadius(temporalAreaRadius);
|
||||
superRes->setOpticalFlow(opticalFlow);
|
||||
|
||||
superRes->setInput(makePtr<OneFrameSource_CUDA>(GpuMat(frame)));
|
||||
|
||||
@ -156,10 +156,10 @@ PERF_TEST_P(Size_MatType, SuperResolution_BTVL1,
|
||||
{
|
||||
Ptr<SuperResolution> superRes = createSuperResolution_BTVL1();
|
||||
|
||||
superRes->set("scale", scale);
|
||||
superRes->set("iterations", iterations);
|
||||
superRes->set("temporalAreaRadius", temporalAreaRadius);
|
||||
superRes->set("opticalFlow", opticalFlow);
|
||||
superRes->setScale(scale);
|
||||
superRes->setIterations(iterations);
|
||||
superRes->setTemporalAreaRadius(temporalAreaRadius);
|
||||
superRes->setOpticalFlow(opticalFlow);
|
||||
|
||||
superRes->setInput(makePtr<OneFrameSource_CPU>(frame));
|
||||
|
||||
@ -198,10 +198,10 @@ OCL_PERF_TEST_P(SuperResolution_BTVL1 ,BTVL1,
|
||||
Ptr<DenseOpticalFlowExt> opticalFlow(new ZeroOpticalFlow);
|
||||
Ptr<SuperResolution> superRes = createSuperResolution_BTVL1();
|
||||
|
||||
superRes->set("scale", scale);
|
||||
superRes->set("iterations", iterations);
|
||||
superRes->set("temporalAreaRadius", temporalAreaRadius);
|
||||
superRes->set("opticalFlow", opticalFlow);
|
||||
superRes->setScale(scale);
|
||||
superRes->setIterations(iterations);
|
||||
superRes->setTemporalAreaRadius(temporalAreaRadius);
|
||||
superRes->setOpticalFlow(opticalFlow);
|
||||
|
||||
superRes->setInput(makePtr<OneFrameSource_CPU>(frame));
|
||||
|
||||
|
@ -460,7 +460,7 @@ namespace
|
||||
func(_src, _dst, btvKernelSize, btvWeights);
|
||||
}
|
||||
|
||||
class BTVL1_Base
|
||||
class BTVL1_Base : public cv::superres::SuperResolution
|
||||
{
|
||||
public:
|
||||
BTVL1_Base();
|
||||
@ -470,6 +470,17 @@ namespace
|
||||
|
||||
void collectGarbage();
|
||||
|
||||
CV_IMPL_PROPERTY(int, Scale, scale_)
|
||||
CV_IMPL_PROPERTY(int, Iterations, iterations_)
|
||||
CV_IMPL_PROPERTY(double, Tau, tau_)
|
||||
CV_IMPL_PROPERTY(double, Labmda, lambda_)
|
||||
CV_IMPL_PROPERTY(double, Alpha, alpha_)
|
||||
CV_IMPL_PROPERTY(int, KernelSize, btvKernelSize_)
|
||||
CV_IMPL_PROPERTY(int, BlurKernelSize, blurKernelSize_)
|
||||
CV_IMPL_PROPERTY(double, BlurSigma, blurSigma_)
|
||||
CV_IMPL_PROPERTY(int, TemporalAreaRadius, temporalAreaRadius_)
|
||||
CV_IMPL_PROPERTY_S(Ptr<cv::superres::DenseOpticalFlowExt>, OpticalFlow, opticalFlow_)
|
||||
|
||||
protected:
|
||||
int scale_;
|
||||
int iterations_;
|
||||
@ -479,7 +490,8 @@ namespace
|
||||
int btvKernelSize_;
|
||||
int blurKernelSize_;
|
||||
double blurSigma_;
|
||||
Ptr<DenseOpticalFlowExt> opticalFlow_;
|
||||
int temporalAreaRadius_; // not used in some implementations
|
||||
Ptr<cv::superres::DenseOpticalFlowExt> opticalFlow_;
|
||||
|
||||
private:
|
||||
bool ocl_process(InputArrayOfArrays src, OutputArray dst, InputArrayOfArrays forwardMotions,
|
||||
@ -539,6 +551,7 @@ namespace
|
||||
btvKernelSize_ = 7;
|
||||
blurKernelSize_ = 5;
|
||||
blurSigma_ = 0.0;
|
||||
temporalAreaRadius_ = 0;
|
||||
opticalFlow_ = createOptFlow_Farneback();
|
||||
|
||||
curBlurKernelSize_ = -1;
|
||||
@ -781,12 +794,9 @@ namespace
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
class BTVL1 :
|
||||
public SuperResolution, private BTVL1_Base
|
||||
class BTVL1 : public BTVL1_Base
|
||||
{
|
||||
public:
|
||||
AlgorithmInfo* info() const;
|
||||
|
||||
BTVL1();
|
||||
|
||||
void collectGarbage();
|
||||
@ -799,8 +809,6 @@ namespace
|
||||
bool ocl_processImpl(Ptr<FrameSource>& frameSource, OutputArray output);
|
||||
|
||||
private:
|
||||
int temporalAreaRadius_;
|
||||
|
||||
void readNextFrame(Ptr<FrameSource>& frameSource);
|
||||
bool ocl_readNextFrame(Ptr<FrameSource>& frameSource);
|
||||
|
||||
@ -841,18 +849,6 @@ namespace
|
||||
#endif
|
||||
};
|
||||
|
||||
CV_INIT_ALGORITHM(BTVL1, "SuperResolution.BTVL1",
|
||||
obj.info()->addParam(obj, "scale", obj.scale_, false, 0, 0, "Scale factor.");
|
||||
obj.info()->addParam(obj, "iterations", obj.iterations_, false, 0, 0, "Iteration count.");
|
||||
obj.info()->addParam(obj, "tau", obj.tau_, false, 0, 0, "Asymptotic value of steepest descent method.");
|
||||
obj.info()->addParam(obj, "lambda", obj.lambda_, false, 0, 0, "Weight parameter to balance data term and smoothness term.");
|
||||
obj.info()->addParam(obj, "alpha", obj.alpha_, false, 0, 0, "Parameter of spacial distribution in Bilateral-TV.");
|
||||
obj.info()->addParam(obj, "btvKernelSize", obj.btvKernelSize_, false, 0, 0, "Kernel size of Bilateral-TV filter.");
|
||||
obj.info()->addParam(obj, "blurKernelSize", obj.blurKernelSize_, false, 0, 0, "Gaussian blur kernel size.");
|
||||
obj.info()->addParam(obj, "blurSigma", obj.blurSigma_, false, 0, 0, "Gaussian blur sigma.");
|
||||
obj.info()->addParam(obj, "temporalAreaRadius", obj.temporalAreaRadius_, false, 0, 0, "Radius of the temporal search area.");
|
||||
obj.info()->addParam<DenseOpticalFlowExt>(obj, "opticalFlow", obj.opticalFlow_, false, 0, 0, "Dense optical flow algorithm."))
|
||||
|
||||
BTVL1::BTVL1()
|
||||
{
|
||||
temporalAreaRadius_ = 4;
|
||||
@ -1101,7 +1097,7 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
Ptr<SuperResolution> cv::superres::createSuperResolution_BTVL1()
|
||||
Ptr<cv::superres::SuperResolution> cv::superres::createSuperResolution_BTVL1()
|
||||
{
|
||||
return makePtr<BTVL1>();
|
||||
}
|
||||
|
@ -207,7 +207,7 @@ namespace
|
||||
funcs[src.channels()](src, dst, ksize);
|
||||
}
|
||||
|
||||
class BTVL1_CUDA_Base
|
||||
class BTVL1_CUDA_Base : public cv::superres::SuperResolution
|
||||
{
|
||||
public:
|
||||
BTVL1_CUDA_Base();
|
||||
@ -218,6 +218,17 @@ namespace
|
||||
|
||||
void collectGarbage();
|
||||
|
||||
CV_IMPL_PROPERTY(int, Scale, scale_)
|
||||
CV_IMPL_PROPERTY(int, Iterations, iterations_)
|
||||
CV_IMPL_PROPERTY(double, Tau, tau_)
|
||||
CV_IMPL_PROPERTY(double, Labmda, lambda_)
|
||||
CV_IMPL_PROPERTY(double, Alpha, alpha_)
|
||||
CV_IMPL_PROPERTY(int, KernelSize, btvKernelSize_)
|
||||
CV_IMPL_PROPERTY(int, BlurKernelSize, blurKernelSize_)
|
||||
CV_IMPL_PROPERTY(double, BlurSigma, blurSigma_)
|
||||
CV_IMPL_PROPERTY(int, TemporalAreaRadius, temporalAreaRadius_)
|
||||
CV_IMPL_PROPERTY_S(Ptr<cv::superres::DenseOpticalFlowExt>, OpticalFlow, opticalFlow_)
|
||||
|
||||
protected:
|
||||
int scale_;
|
||||
int iterations_;
|
||||
@ -227,7 +238,8 @@ namespace
|
||||
int btvKernelSize_;
|
||||
int blurKernelSize_;
|
||||
double blurSigma_;
|
||||
Ptr<DenseOpticalFlowExt> opticalFlow_;
|
||||
int temporalAreaRadius_;
|
||||
Ptr<cv::superres::DenseOpticalFlowExt> opticalFlow_;
|
||||
|
||||
private:
|
||||
std::vector<Ptr<cuda::Filter> > filters_;
|
||||
@ -272,6 +284,7 @@ namespace
|
||||
#else
|
||||
opticalFlow_ = createOptFlow_Farneback();
|
||||
#endif
|
||||
temporalAreaRadius_ = 0;
|
||||
|
||||
curBlurKernelSize_ = -1;
|
||||
curBlurSigma_ = -1.0;
|
||||
@ -401,11 +414,9 @@ namespace
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
class BTVL1_CUDA : public SuperResolution, private BTVL1_CUDA_Base
|
||||
class BTVL1_CUDA : public BTVL1_CUDA_Base
|
||||
{
|
||||
public:
|
||||
AlgorithmInfo* info() const;
|
||||
|
||||
BTVL1_CUDA();
|
||||
|
||||
void collectGarbage();
|
||||
@ -415,8 +426,6 @@ namespace
|
||||
void processImpl(Ptr<FrameSource>& frameSource, OutputArray output);
|
||||
|
||||
private:
|
||||
int temporalAreaRadius_;
|
||||
|
||||
void readNextFrame(Ptr<FrameSource>& frameSource);
|
||||
void processFrame(int idx);
|
||||
|
||||
@ -438,18 +447,6 @@ namespace
|
||||
GpuMat finalOutput_;
|
||||
};
|
||||
|
||||
CV_INIT_ALGORITHM(BTVL1_CUDA, "SuperResolution.BTVL1_CUDA",
|
||||
obj.info()->addParam(obj, "scale", obj.scale_, false, 0, 0, "Scale factor.");
|
||||
obj.info()->addParam(obj, "iterations", obj.iterations_, false, 0, 0, "Iteration count.");
|
||||
obj.info()->addParam(obj, "tau", obj.tau_, false, 0, 0, "Asymptotic value of steepest descent method.");
|
||||
obj.info()->addParam(obj, "lambda", obj.lambda_, false, 0, 0, "Weight parameter to balance data term and smoothness term.");
|
||||
obj.info()->addParam(obj, "alpha", obj.alpha_, false, 0, 0, "Parameter of spacial distribution in Bilateral-TV.");
|
||||
obj.info()->addParam(obj, "btvKernelSize", obj.btvKernelSize_, false, 0, 0, "Kernel size of Bilateral-TV filter.");
|
||||
obj.info()->addParam(obj, "blurKernelSize", obj.blurKernelSize_, false, 0, 0, "Gaussian blur kernel size.");
|
||||
obj.info()->addParam(obj, "blurSigma", obj.blurSigma_, false, 0, 0, "Gaussian blur sigma.");
|
||||
obj.info()->addParam(obj, "temporalAreaRadius", obj.temporalAreaRadius_, false, 0, 0, "Radius of the temporal search area.");
|
||||
obj.info()->addParam<DenseOpticalFlowExt>(obj, "opticalFlow", obj.opticalFlow_, false, 0, 0, "Dense optical flow algorithm."));
|
||||
|
||||
BTVL1_CUDA::BTVL1_CUDA()
|
||||
{
|
||||
temporalAreaRadius_ = 4;
|
||||
|
@ -53,7 +53,7 @@ using namespace cv::superres::detail;
|
||||
|
||||
namespace
|
||||
{
|
||||
class CpuOpticalFlow : public DenseOpticalFlowExt
|
||||
class CpuOpticalFlow : public virtual cv::superres::DenseOpticalFlowExt
|
||||
{
|
||||
public:
|
||||
explicit CpuOpticalFlow(int work_type);
|
||||
@ -173,12 +173,20 @@ namespace
|
||||
|
||||
namespace
|
||||
{
|
||||
class Farneback : public CpuOpticalFlow
|
||||
class Farneback : public CpuOpticalFlow, public cv::superres::FarnebackOpticalFlow
|
||||
{
|
||||
public:
|
||||
AlgorithmInfo* info() const;
|
||||
|
||||
Farneback();
|
||||
void calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2);
|
||||
void collectGarbage();
|
||||
|
||||
CV_IMPL_PROPERTY(double, PyrScale, pyrScale_)
|
||||
CV_IMPL_PROPERTY(int, LevelsNumber, numLevels_)
|
||||
CV_IMPL_PROPERTY(int, WindowSize, winSize_)
|
||||
CV_IMPL_PROPERTY(int, Iterations, numIters_)
|
||||
CV_IMPL_PROPERTY(int, PolyN, polyN_)
|
||||
CV_IMPL_PROPERTY(double, PolySigma, polySigma_)
|
||||
CV_IMPL_PROPERTY(int, Flags, flags_)
|
||||
|
||||
protected:
|
||||
void impl(InputArray input0, InputArray input1, OutputArray dst);
|
||||
@ -193,15 +201,6 @@ namespace
|
||||
int flags_;
|
||||
};
|
||||
|
||||
CV_INIT_ALGORITHM(Farneback, "DenseOpticalFlowExt.Farneback",
|
||||
obj.info()->addParam(obj, "pyrScale", obj.pyrScale_);
|
||||
obj.info()->addParam(obj, "numLevels", obj.numLevels_);
|
||||
obj.info()->addParam(obj, "winSize", obj.winSize_);
|
||||
obj.info()->addParam(obj, "numIters", obj.numIters_);
|
||||
obj.info()->addParam(obj, "polyN", obj.polyN_);
|
||||
obj.info()->addParam(obj, "polySigma", obj.polySigma_);
|
||||
obj.info()->addParam(obj, "flags", obj.flags_))
|
||||
|
||||
Farneback::Farneback() : CpuOpticalFlow(CV_8UC1)
|
||||
{
|
||||
pyrScale_ = 0.5;
|
||||
@ -213,6 +212,16 @@ namespace
|
||||
flags_ = 0;
|
||||
}
|
||||
|
||||
void Farneback::calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2)
|
||||
{
|
||||
CpuOpticalFlow::calc(frame0, frame1, flow1, flow2);
|
||||
}
|
||||
|
||||
void Farneback::collectGarbage()
|
||||
{
|
||||
CpuOpticalFlow::collectGarbage();
|
||||
}
|
||||
|
||||
void Farneback::impl(InputArray input0, InputArray input1, OutputArray dst)
|
||||
{
|
||||
calcOpticalFlowFarneback(input0, input1, (InputOutputArray)dst, pyrScale_,
|
||||
@ -221,7 +230,7 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_Farneback()
|
||||
Ptr<cv::superres::FarnebackOpticalFlow> cv::superres::createOptFlow_Farneback()
|
||||
{
|
||||
return makePtr<Farneback>();
|
||||
}
|
||||
@ -319,65 +328,53 @@ Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_Simple()
|
||||
|
||||
namespace
|
||||
{
|
||||
class DualTVL1 : public CpuOpticalFlow
|
||||
#define CV_WRAP_PROPERTY(type, name, internal_name, internal_obj) \
|
||||
type get##name() const \
|
||||
{ \
|
||||
return internal_obj->get##internal_name(); \
|
||||
} \
|
||||
void set##name(type _name) \
|
||||
{ \
|
||||
internal_obj->set##internal_name(_name); \
|
||||
}
|
||||
|
||||
#define CV_WRAP_SAME_PROPERTY(type, name, internal_obj) CV_WRAP_PROPERTY(type, name, name, internal_obj)
|
||||
|
||||
class DualTVL1 : public CpuOpticalFlow, public virtual cv::superres::DualTVL1OpticalFlow
|
||||
{
|
||||
public:
|
||||
AlgorithmInfo* info() const;
|
||||
|
||||
DualTVL1();
|
||||
|
||||
void calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2);
|
||||
void collectGarbage();
|
||||
|
||||
CV_WRAP_SAME_PROPERTY(double, Tau, alg_)
|
||||
CV_WRAP_SAME_PROPERTY(double, Lambda, alg_)
|
||||
CV_WRAP_SAME_PROPERTY(double, Theta, alg_)
|
||||
CV_WRAP_SAME_PROPERTY(int, ScalesNumber, alg_)
|
||||
CV_WRAP_SAME_PROPERTY(int, WarpingsNumber, alg_)
|
||||
CV_WRAP_SAME_PROPERTY(double, Epsilon, alg_)
|
||||
CV_WRAP_PROPERTY(int, Iterations, OuterIterations, alg_)
|
||||
CV_WRAP_SAME_PROPERTY(bool, UseInitialFlow, alg_)
|
||||
|
||||
protected:
|
||||
void impl(InputArray input0, InputArray input1, OutputArray dst);
|
||||
|
||||
private:
|
||||
double tau_;
|
||||
double lambda_;
|
||||
double theta_;
|
||||
int nscales_;
|
||||
int warps_;
|
||||
double epsilon_;
|
||||
int iterations_;
|
||||
bool useInitialFlow_;
|
||||
|
||||
Ptr<cv::DenseOpticalFlow> alg_;
|
||||
Ptr<cv::DualTVL1OpticalFlow> alg_;
|
||||
};
|
||||
|
||||
CV_INIT_ALGORITHM(DualTVL1, "DenseOpticalFlowExt.DualTVL1",
|
||||
obj.info()->addParam(obj, "tau", obj.tau_);
|
||||
obj.info()->addParam(obj, "lambda", obj.lambda_);
|
||||
obj.info()->addParam(obj, "theta", obj.theta_);
|
||||
obj.info()->addParam(obj, "nscales", obj.nscales_);
|
||||
obj.info()->addParam(obj, "warps", obj.warps_);
|
||||
obj.info()->addParam(obj, "epsilon", obj.epsilon_);
|
||||
obj.info()->addParam(obj, "iterations", obj.iterations_);
|
||||
obj.info()->addParam(obj, "useInitialFlow", obj.useInitialFlow_))
|
||||
|
||||
DualTVL1::DualTVL1() : CpuOpticalFlow(CV_8UC1)
|
||||
{
|
||||
alg_ = cv::createOptFlow_DualTVL1();
|
||||
tau_ = alg_->getDouble("tau");
|
||||
lambda_ = alg_->getDouble("lambda");
|
||||
theta_ = alg_->getDouble("theta");
|
||||
nscales_ = alg_->getInt("nscales");
|
||||
warps_ = alg_->getInt("warps");
|
||||
epsilon_ = alg_->getDouble("epsilon");
|
||||
iterations_ = alg_->getInt("iterations");
|
||||
useInitialFlow_ = alg_->getBool("useInitialFlow");
|
||||
}
|
||||
|
||||
void DualTVL1::calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2)
|
||||
{
|
||||
CpuOpticalFlow::calc(frame0, frame1, flow1, flow2);
|
||||
}
|
||||
|
||||
void DualTVL1::impl(InputArray input0, InputArray input1, OutputArray dst)
|
||||
{
|
||||
alg_->set("tau", tau_);
|
||||
alg_->set("lambda", lambda_);
|
||||
alg_->set("theta", theta_);
|
||||
alg_->set("nscales", nscales_);
|
||||
alg_->set("warps", warps_);
|
||||
alg_->set("epsilon", epsilon_);
|
||||
alg_->set("iterations", iterations_);
|
||||
alg_->set("useInitialFlow", useInitialFlow_);
|
||||
|
||||
alg_->calc(input0, input1, (InputOutputArray)dst);
|
||||
}
|
||||
|
||||
@ -388,7 +385,7 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_DualTVL1()
|
||||
Ptr<cv::superres::DualTVL1OpticalFlow> cv::superres::createOptFlow_DualTVL1()
|
||||
{
|
||||
return makePtr<DualTVL1>();
|
||||
}
|
||||
@ -398,35 +395,35 @@ Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_DualTVL1()
|
||||
|
||||
#ifndef HAVE_OPENCV_CUDAOPTFLOW
|
||||
|
||||
Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_Farneback_CUDA()
|
||||
Ptr<cv::superres::FarnebackOpticalFlow> cv::superres::createOptFlow_Farneback_CUDA()
|
||||
{
|
||||
CV_Error(cv::Error::StsNotImplemented, "The called functionality is disabled for current build or platform");
|
||||
return Ptr<DenseOpticalFlowExt>();
|
||||
return Ptr<cv::superres::FarnebackOpticalFlow>();
|
||||
}
|
||||
|
||||
Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_DualTVL1_CUDA()
|
||||
Ptr<cv::superres::DualTVL1OpticalFlow> cv::superres::createOptFlow_DualTVL1_CUDA()
|
||||
{
|
||||
CV_Error(cv::Error::StsNotImplemented, "The called functionality is disabled for current build or platform");
|
||||
return Ptr<DenseOpticalFlowExt>();
|
||||
return Ptr<cv::superres::DualTVL1OpticalFlow>();
|
||||
}
|
||||
|
||||
Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_Brox_CUDA()
|
||||
Ptr<cv::superres::BroxOpticalFlow> cv::superres::createOptFlow_Brox_CUDA()
|
||||
{
|
||||
CV_Error(cv::Error::StsNotImplemented, "The called functionality is disabled for current build or platform");
|
||||
return Ptr<DenseOpticalFlowExt>();
|
||||
return Ptr<cv::superres::BroxOpticalFlow>();
|
||||
}
|
||||
|
||||
Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_PyrLK_CUDA()
|
||||
Ptr<cv::superres::PyrLKOpticalFlow> cv::superres::createOptFlow_PyrLK_CUDA()
|
||||
{
|
||||
CV_Error(cv::Error::StsNotImplemented, "The called functionality is disabled for current build or platform");
|
||||
return Ptr<DenseOpticalFlowExt>();
|
||||
return Ptr<cv::superres::PyrLKOpticalFlow>();
|
||||
}
|
||||
|
||||
#else // HAVE_OPENCV_CUDAOPTFLOW
|
||||
|
||||
namespace
|
||||
{
|
||||
class GpuOpticalFlow : public DenseOpticalFlowExt
|
||||
class GpuOpticalFlow : public virtual cv::superres::DenseOpticalFlowExt
|
||||
{
|
||||
public:
|
||||
explicit GpuOpticalFlow(int work_type);
|
||||
@ -494,15 +491,20 @@ namespace
|
||||
|
||||
namespace
|
||||
{
|
||||
class Brox_CUDA : public GpuOpticalFlow
|
||||
class Brox_CUDA : public GpuOpticalFlow, public virtual cv::superres::BroxOpticalFlow
|
||||
{
|
||||
public:
|
||||
AlgorithmInfo* info() const;
|
||||
|
||||
Brox_CUDA();
|
||||
|
||||
void calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2);
|
||||
void collectGarbage();
|
||||
|
||||
CV_IMPL_PROPERTY(double, Alpha, alpha_)
|
||||
CV_IMPL_PROPERTY(double, Gamma, gamma_)
|
||||
CV_IMPL_PROPERTY(double, ScaleFactor, scaleFactor_)
|
||||
CV_IMPL_PROPERTY(int, InnerIterations, innerIterations_)
|
||||
CV_IMPL_PROPERTY(int, OuterIterations, outerIterations_)
|
||||
CV_IMPL_PROPERTY(int, SolverIterations, solverIterations_)
|
||||
|
||||
protected:
|
||||
void impl(const GpuMat& input0, const GpuMat& input1, GpuMat& dst1, GpuMat& dst2);
|
||||
|
||||
@ -517,14 +519,6 @@ namespace
|
||||
Ptr<cuda::BroxOpticalFlow> alg_;
|
||||
};
|
||||
|
||||
CV_INIT_ALGORITHM(Brox_CUDA, "DenseOpticalFlowExt.Brox_CUDA",
|
||||
obj.info()->addParam(obj, "alpha", obj.alpha_, false, 0, 0, "Flow smoothness");
|
||||
obj.info()->addParam(obj, "gamma", obj.gamma_, false, 0, 0, "Gradient constancy importance");
|
||||
obj.info()->addParam(obj, "scaleFactor", obj.scaleFactor_, false, 0, 0, "Pyramid scale factor");
|
||||
obj.info()->addParam(obj, "innerIterations", obj.innerIterations_, false, 0, 0, "Number of lagged non-linearity iterations (inner loop)");
|
||||
obj.info()->addParam(obj, "outerIterations", obj.outerIterations_, false, 0, 0, "Number of warping iterations (number of pyramid levels)");
|
||||
obj.info()->addParam(obj, "solverIterations", obj.solverIterations_, false, 0, 0, "Number of linear system solver iterations"))
|
||||
|
||||
Brox_CUDA::Brox_CUDA() : GpuOpticalFlow(CV_32FC1)
|
||||
{
|
||||
alg_ = cuda::BroxOpticalFlow::create(0.197f, 50.0f, 0.8f, 10, 77, 10);
|
||||
@ -537,6 +531,11 @@ namespace
|
||||
solverIterations_ = alg_->getSolverIterations();
|
||||
}
|
||||
|
||||
void Brox_CUDA::calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2)
|
||||
{
|
||||
GpuOpticalFlow::calc(frame0, frame1, flow1, flow2);
|
||||
}
|
||||
|
||||
void Brox_CUDA::impl(const GpuMat& input0, const GpuMat& input1, GpuMat& dst1, GpuMat& dst2)
|
||||
{
|
||||
alg_->setFlowSmoothness(alpha_);
|
||||
@ -563,7 +562,7 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_Brox_CUDA()
|
||||
Ptr<cv::superres::BroxOpticalFlow> cv::superres::createOptFlow_Brox_CUDA()
|
||||
{
|
||||
return makePtr<Brox_CUDA>();
|
||||
}
|
||||
@ -573,15 +572,17 @@ Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_Brox_CUDA()
|
||||
|
||||
namespace
|
||||
{
|
||||
class PyrLK_CUDA : public GpuOpticalFlow
|
||||
class PyrLK_CUDA : public GpuOpticalFlow, public cv::superres::PyrLKOpticalFlow
|
||||
{
|
||||
public:
|
||||
AlgorithmInfo* info() const;
|
||||
|
||||
PyrLK_CUDA();
|
||||
|
||||
void calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2);
|
||||
void collectGarbage();
|
||||
|
||||
CV_IMPL_PROPERTY(int, WindowSize, winSize_)
|
||||
CV_IMPL_PROPERTY(int, MaxLevel, maxLevel_)
|
||||
CV_IMPL_PROPERTY(int, Iterations, iterations_)
|
||||
|
||||
protected:
|
||||
void impl(const GpuMat& input0, const GpuMat& input1, GpuMat& dst1, GpuMat& dst2);
|
||||
|
||||
@ -593,11 +594,6 @@ namespace
|
||||
Ptr<cuda::DensePyrLKOpticalFlow> alg_;
|
||||
};
|
||||
|
||||
CV_INIT_ALGORITHM(PyrLK_CUDA, "DenseOpticalFlowExt.PyrLK_CUDA",
|
||||
obj.info()->addParam(obj, "winSize", obj.winSize_);
|
||||
obj.info()->addParam(obj, "maxLevel", obj.maxLevel_);
|
||||
obj.info()->addParam(obj, "iterations", obj.iterations_))
|
||||
|
||||
PyrLK_CUDA::PyrLK_CUDA() : GpuOpticalFlow(CV_8UC1)
|
||||
{
|
||||
alg_ = cuda::DensePyrLKOpticalFlow::create();
|
||||
@ -607,6 +603,11 @@ namespace
|
||||
iterations_ = alg_->getNumIters();
|
||||
}
|
||||
|
||||
void PyrLK_CUDA::calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2)
|
||||
{
|
||||
GpuOpticalFlow::calc(frame0, frame1, flow1, flow2);
|
||||
}
|
||||
|
||||
void PyrLK_CUDA::impl(const GpuMat& input0, const GpuMat& input1, GpuMat& dst1, GpuMat& dst2)
|
||||
{
|
||||
alg_->setWinSize(Size(winSize_, winSize_));
|
||||
@ -630,7 +631,7 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_PyrLK_CUDA()
|
||||
Ptr<cv::superres::PyrLKOpticalFlow> cv::superres::createOptFlow_PyrLK_CUDA()
|
||||
{
|
||||
return makePtr<PyrLK_CUDA>();
|
||||
}
|
||||
@ -640,15 +641,21 @@ Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_PyrLK_CUDA()
|
||||
|
||||
namespace
|
||||
{
|
||||
class Farneback_CUDA : public GpuOpticalFlow
|
||||
class Farneback_CUDA : public GpuOpticalFlow, public cv::superres::FarnebackOpticalFlow
|
||||
{
|
||||
public:
|
||||
AlgorithmInfo* info() const;
|
||||
|
||||
Farneback_CUDA();
|
||||
|
||||
void calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2);
|
||||
void collectGarbage();
|
||||
|
||||
CV_IMPL_PROPERTY(double, PyrScale, pyrScale_)
|
||||
CV_IMPL_PROPERTY(int, LevelsNumber, numLevels_)
|
||||
CV_IMPL_PROPERTY(int, WindowSize, winSize_)
|
||||
CV_IMPL_PROPERTY(int, Iterations, numIters_)
|
||||
CV_IMPL_PROPERTY(int, PolyN, polyN_)
|
||||
CV_IMPL_PROPERTY(double, PolySigma, polySigma_)
|
||||
CV_IMPL_PROPERTY(int, Flags, flags_)
|
||||
|
||||
protected:
|
||||
void impl(const GpuMat& input0, const GpuMat& input1, GpuMat& dst1, GpuMat& dst2);
|
||||
|
||||
@ -664,15 +671,6 @@ namespace
|
||||
Ptr<cuda::FarnebackOpticalFlow> alg_;
|
||||
};
|
||||
|
||||
CV_INIT_ALGORITHM(Farneback_CUDA, "DenseOpticalFlowExt.Farneback_CUDA",
|
||||
obj.info()->addParam(obj, "pyrScale", obj.pyrScale_);
|
||||
obj.info()->addParam(obj, "numLevels", obj.numLevels_);
|
||||
obj.info()->addParam(obj, "winSize", obj.winSize_);
|
||||
obj.info()->addParam(obj, "numIters", obj.numIters_);
|
||||
obj.info()->addParam(obj, "polyN", obj.polyN_);
|
||||
obj.info()->addParam(obj, "polySigma", obj.polySigma_);
|
||||
obj.info()->addParam(obj, "flags", obj.flags_))
|
||||
|
||||
Farneback_CUDA::Farneback_CUDA() : GpuOpticalFlow(CV_8UC1)
|
||||
{
|
||||
alg_ = cuda::FarnebackOpticalFlow::create();
|
||||
@ -686,6 +684,11 @@ namespace
|
||||
flags_ = alg_->getFlags();
|
||||
}
|
||||
|
||||
void Farneback_CUDA::calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2)
|
||||
{
|
||||
GpuOpticalFlow::calc(frame0, frame1, flow1, flow2);
|
||||
}
|
||||
|
||||
void Farneback_CUDA::impl(const GpuMat& input0, const GpuMat& input1, GpuMat& dst1, GpuMat& dst2)
|
||||
{
|
||||
alg_->setPyrScale(pyrScale_);
|
||||
@ -713,7 +716,7 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_Farneback_CUDA()
|
||||
Ptr<cv::superres::FarnebackOpticalFlow> cv::superres::createOptFlow_Farneback_CUDA()
|
||||
{
|
||||
return makePtr<Farneback_CUDA>();
|
||||
}
|
||||
@ -723,15 +726,22 @@ Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_Farneback_CUDA()
|
||||
|
||||
namespace
|
||||
{
|
||||
class DualTVL1_CUDA : public GpuOpticalFlow
|
||||
class DualTVL1_CUDA : public GpuOpticalFlow, public cv::superres::DualTVL1OpticalFlow
|
||||
{
|
||||
public:
|
||||
AlgorithmInfo* info() const;
|
||||
|
||||
DualTVL1_CUDA();
|
||||
|
||||
void calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2);
|
||||
void collectGarbage();
|
||||
|
||||
CV_IMPL_PROPERTY(double, Tau, tau_)
|
||||
CV_IMPL_PROPERTY(double, Lambda, lambda_)
|
||||
CV_IMPL_PROPERTY(double, Theta, theta_)
|
||||
CV_IMPL_PROPERTY(int, ScalesNumber, nscales_)
|
||||
CV_IMPL_PROPERTY(int, WarpingsNumber, warps_)
|
||||
CV_IMPL_PROPERTY(double, Epsilon, epsilon_)
|
||||
CV_IMPL_PROPERTY(int, Iterations, iterations_)
|
||||
CV_IMPL_PROPERTY(bool, UseInitialFlow, useInitialFlow_)
|
||||
|
||||
protected:
|
||||
void impl(const GpuMat& input0, const GpuMat& input1, GpuMat& dst1, GpuMat& dst2);
|
||||
|
||||
@ -748,16 +758,6 @@ namespace
|
||||
Ptr<cuda::OpticalFlowDual_TVL1> alg_;
|
||||
};
|
||||
|
||||
CV_INIT_ALGORITHM(DualTVL1_CUDA, "DenseOpticalFlowExt.DualTVL1_CUDA",
|
||||
obj.info()->addParam(obj, "tau", obj.tau_);
|
||||
obj.info()->addParam(obj, "lambda", obj.lambda_);
|
||||
obj.info()->addParam(obj, "theta", obj.theta_);
|
||||
obj.info()->addParam(obj, "nscales", obj.nscales_);
|
||||
obj.info()->addParam(obj, "warps", obj.warps_);
|
||||
obj.info()->addParam(obj, "epsilon", obj.epsilon_);
|
||||
obj.info()->addParam(obj, "iterations", obj.iterations_);
|
||||
obj.info()->addParam(obj, "useInitialFlow", obj.useInitialFlow_))
|
||||
|
||||
DualTVL1_CUDA::DualTVL1_CUDA() : GpuOpticalFlow(CV_8UC1)
|
||||
{
|
||||
alg_ = cuda::OpticalFlowDual_TVL1::create();
|
||||
@ -772,6 +772,11 @@ namespace
|
||||
useInitialFlow_ = alg_->getUseInitialFlow();
|
||||
}
|
||||
|
||||
void DualTVL1_CUDA::calc(InputArray frame0, InputArray frame1, OutputArray flow1, OutputArray flow2)
|
||||
{
|
||||
GpuOpticalFlow::calc(frame0, frame1, flow1, flow2);
|
||||
}
|
||||
|
||||
void DualTVL1_CUDA::impl(const GpuMat& input0, const GpuMat& input1, GpuMat& dst1, GpuMat& dst2)
|
||||
{
|
||||
alg_->setTau(tau_);
|
||||
@ -800,7 +805,7 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
Ptr<DenseOpticalFlowExt> cv::superres::createOptFlow_DualTVL1_CUDA()
|
||||
Ptr<cv::superres::DualTVL1OpticalFlow> cv::superres::createOptFlow_DualTVL1_CUDA()
|
||||
{
|
||||
return makePtr<DualTVL1_CUDA>();
|
||||
}
|
||||
|
@ -45,11 +45,6 @@
|
||||
using namespace cv;
|
||||
using namespace cv::superres;
|
||||
|
||||
bool cv::superres::initModule_superres()
|
||||
{
|
||||
return !createSuperResolution_BTVL1().empty();
|
||||
}
|
||||
|
||||
cv::superres::SuperResolution::SuperResolution()
|
||||
{
|
||||
frameSource_ = createFrameSource_Empty();
|
||||
|
@ -222,11 +222,11 @@ void SuperResolution::RunTest(cv::Ptr<cv::superres::SuperResolution> superRes)
|
||||
|
||||
ASSERT_FALSE( superRes.empty() );
|
||||
|
||||
const int btvKernelSize = superRes->getInt("btvKernelSize");
|
||||
const int btvKernelSize = superRes->getKernelSize();
|
||||
|
||||
superRes->set("scale", scale);
|
||||
superRes->set("iterations", iterations);
|
||||
superRes->set("temporalAreaRadius", temporalAreaRadius);
|
||||
superRes->setScale(scale);
|
||||
superRes->setIterations(iterations);
|
||||
superRes->setTemporalAreaRadius(temporalAreaRadius);
|
||||
|
||||
cv::Ptr<cv::superres::FrameSource> goldSource(new AllignedFrameSource(cv::superres::createFrameSource_Video(inputVideoName), scale));
|
||||
cv::Ptr<cv::superres::FrameSource> lowResSource(new DegradeFrameSource(
|
||||
|
@ -380,6 +380,21 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class CV_EXPORTS_W DenseOpticalFlow : public Algorithm
|
||||
{
|
||||
public:
|
||||
/** @brief Calculates an optical flow.
|
||||
|
||||
@param I0 first 8-bit single-channel input image.
|
||||
@param I1 second input image of the same size and the same type as prev.
|
||||
@param flow computed flow image that has the same size as prev and type CV_32FC2.
|
||||
*/
|
||||
CV_WRAP virtual void calc( InputArray I0, InputArray I1, InputOutputArray flow ) = 0;
|
||||
/** @brief Releases all inner buffers.
|
||||
*/
|
||||
CV_WRAP virtual void collectGarbage() = 0;
|
||||
};
|
||||
|
||||
/** @brief "Dual TV L1" Optical Flow Algorithm.
|
||||
|
||||
The class implements the "Dual TV L1" optical flow algorithm described in @cite Zach2007 and
|
||||
@ -422,24 +437,38 @@ constructing the class instance:
|
||||
C. Zach, T. Pock and H. Bischof, "A Duality Based Approach for Realtime TV-L1 Optical Flow".
|
||||
Javier Sanchez, Enric Meinhardt-Llopis and Gabriele Facciolo. "TV-L1 Optical Flow Estimation".
|
||||
*/
|
||||
class CV_EXPORTS_W DenseOpticalFlow : public Algorithm
|
||||
class CV_EXPORTS_W DualTVL1OpticalFlow : public DenseOpticalFlow
|
||||
{
|
||||
public:
|
||||
/** @brief Calculates an optical flow.
|
||||
|
||||
@param I0 first 8-bit single-channel input image.
|
||||
@param I1 second input image of the same size and the same type as prev.
|
||||
@param flow computed flow image that has the same size as prev and type CV_32FC2.
|
||||
*/
|
||||
CV_WRAP virtual void calc( InputArray I0, InputArray I1, InputOutputArray flow ) = 0;
|
||||
/** @brief Releases all inner buffers.
|
||||
*/
|
||||
CV_WRAP virtual void collectGarbage() = 0;
|
||||
//! @name Time step of the numerical scheme
|
||||
CV_PURE_PROPERTY(double, Tau)
|
||||
//! @name Weight parameter for the data term, attachment parameter
|
||||
CV_PURE_PROPERTY(double, Lambda)
|
||||
//! @name Weight parameter for (u - v)^2, tightness parameter
|
||||
CV_PURE_PROPERTY(double, Theta)
|
||||
//! @name coefficient for additional illumination variation term
|
||||
CV_PURE_PROPERTY(double, Gamma)
|
||||
//! @name Number of scales used to create the pyramid of images
|
||||
CV_PURE_PROPERTY(int, ScalesNumber)
|
||||
//! @name Number of warpings per scale
|
||||
CV_PURE_PROPERTY(int, WarpingsNumber)
|
||||
//! @name Stopping criterion threshold used in the numerical scheme, which is a trade-off between precision and running time
|
||||
CV_PURE_PROPERTY(double, Epsilon)
|
||||
//! @name Inner iterations (between outlier filtering) used in the numerical scheme
|
||||
CV_PURE_PROPERTY(int, InnerIterations)
|
||||
//! @name Outer iterations (number of inner loops) used in the numerical scheme
|
||||
CV_PURE_PROPERTY(int, OuterIterations)
|
||||
//! @name Use initial flow
|
||||
CV_PURE_PROPERTY(bool, UseInitialFlow)
|
||||
//! @name Step between scales (<1)
|
||||
CV_PURE_PROPERTY(double, ScaleStep)
|
||||
//! @name Median filter kernel size (1 = no filter) (3 or 5)
|
||||
CV_PURE_PROPERTY(int, MedianFiltering)
|
||||
};
|
||||
|
||||
/** @brief Creates instance of cv::DenseOpticalFlow
|
||||
*/
|
||||
CV_EXPORTS_W Ptr<DenseOpticalFlow> createOptFlow_DualTVL1();
|
||||
CV_EXPORTS_W Ptr<DualTVL1OpticalFlow> createOptFlow_DualTVL1();
|
||||
|
||||
//! @} video_track
|
||||
|
||||
|
@ -87,11 +87,11 @@ OCL_PERF_TEST_P(OpticalFlowDualTVL1Fixture, OpticalFlowDualTVL1,
|
||||
declare.in(uFrame0, uFrame1, WARMUP_READ).out(uFlow, WARMUP_READ);
|
||||
|
||||
//create algorithm
|
||||
cv::Ptr<cv::DenseOpticalFlow> alg = cv::createOptFlow_DualTVL1();
|
||||
cv::Ptr<cv::DualTVL1OpticalFlow> alg = cv::createOptFlow_DualTVL1();
|
||||
|
||||
//set parameters
|
||||
alg->set("scaleStep", scaleStep);
|
||||
alg->setInt("medianFiltering", medianFiltering);
|
||||
alg->setScaleStep(scaleStep);
|
||||
alg->setMedianFiltering(medianFiltering);
|
||||
|
||||
if (useInitFlow)
|
||||
{
|
||||
@ -100,7 +100,7 @@ OCL_PERF_TEST_P(OpticalFlowDualTVL1Fixture, OpticalFlowDualTVL1,
|
||||
}
|
||||
|
||||
//set flag to use initial flow
|
||||
alg->setBool("useInitialFlow", useInitFlow);
|
||||
alg->setUseInitialFlow(useInitFlow);
|
||||
OCL_TEST_CYCLE()
|
||||
alg->calc(uFrame0, uFrame1, uFlow);
|
||||
|
||||
@ -109,4 +109,4 @@ OCL_PERF_TEST_P(OpticalFlowDualTVL1Fixture, OpticalFlowDualTVL1,
|
||||
}
|
||||
} // namespace cvtest::ocl
|
||||
|
||||
#endif // HAVE_OPENCL
|
||||
#endif // HAVE_OPENCL
|
||||
|
@ -160,8 +160,6 @@ public:
|
||||
nNextLongUpdate = Scalar::all(0);
|
||||
}
|
||||
|
||||
virtual AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
virtual int getHistory() const { return history; }
|
||||
virtual void setHistory(int _nframes) { history = _nframes; }
|
||||
|
||||
|
@ -230,8 +230,6 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
virtual AlgorithmInfo* info() const { return 0; }
|
||||
|
||||
virtual int getHistory() const { return history; }
|
||||
virtual void setHistory(int _nframes) { history = _nframes; }
|
||||
|
||||
|
@ -86,7 +86,7 @@ using namespace cv;
|
||||
|
||||
namespace {
|
||||
|
||||
class OpticalFlowDual_TVL1 : public DenseOpticalFlow
|
||||
class OpticalFlowDual_TVL1 : public DualTVL1OpticalFlow
|
||||
{
|
||||
public:
|
||||
OpticalFlowDual_TVL1();
|
||||
@ -94,7 +94,18 @@ public:
|
||||
void calc(InputArray I0, InputArray I1, InputOutputArray flow);
|
||||
void collectGarbage();
|
||||
|
||||
AlgorithmInfo* info() const;
|
||||
CV_IMPL_PROPERTY(double, Tau, tau)
|
||||
CV_IMPL_PROPERTY(double, Lambda, lambda)
|
||||
CV_IMPL_PROPERTY(double, Theta, theta)
|
||||
CV_IMPL_PROPERTY(double, Gamma, gamma)
|
||||
CV_IMPL_PROPERTY(int, ScalesNumber, nscales)
|
||||
CV_IMPL_PROPERTY(int, WarpingsNumber, warps)
|
||||
CV_IMPL_PROPERTY(double, Epsilon, epsilon)
|
||||
CV_IMPL_PROPERTY(int, InnerIterations, innerIterations)
|
||||
CV_IMPL_PROPERTY(int, OuterIterations, outerIterations)
|
||||
CV_IMPL_PROPERTY(bool, UseInitialFlow, useInitialFlow)
|
||||
CV_IMPL_PROPERTY(double, ScaleStep, scaleStep)
|
||||
CV_IMPL_PROPERTY(int, MedianFiltering, medianFiltering)
|
||||
|
||||
protected:
|
||||
double tau;
|
||||
@ -1416,35 +1427,9 @@ void OpticalFlowDual_TVL1::collectGarbage()
|
||||
dum.norm_buf.release();
|
||||
}
|
||||
|
||||
|
||||
CV_INIT_ALGORITHM(OpticalFlowDual_TVL1, "DenseOpticalFlow.DualTVL1",
|
||||
obj.info()->addParam(obj, "tau", obj.tau, false, 0, 0,
|
||||
"Time step of the numerical scheme");
|
||||
obj.info()->addParam(obj, "lambda", obj.lambda, false, 0, 0,
|
||||
"Weight parameter for the data term, attachment parameter");
|
||||
obj.info()->addParam(obj, "theta", obj.theta, false, 0, 0,
|
||||
"Weight parameter for (u - v)^2, tightness parameter");
|
||||
obj.info()->addParam(obj, "nscales", obj.nscales, false, 0, 0,
|
||||
"Number of scales used to create the pyramid of images");
|
||||
obj.info()->addParam(obj, "warps", obj.warps, false, 0, 0,
|
||||
"Number of warpings per scale");
|
||||
obj.info()->addParam(obj, "medianFiltering", obj.medianFiltering, false, 0, 0,
|
||||
"Median filter kernel size (1 = no filter) (3 or 5)");
|
||||
obj.info()->addParam(obj, "scaleStep", obj.scaleStep, false, 0, 0,
|
||||
"Step between scales (<1)");
|
||||
obj.info()->addParam(obj, "epsilon", obj.epsilon, false, 0, 0,
|
||||
"Stopping criterion threshold used in the numerical scheme, which is a trade-off between precision and running time");
|
||||
obj.info()->addParam(obj, "innerIterations", obj.innerIterations, false, 0, 0,
|
||||
"inner iterations (between outlier filtering) used in the numerical scheme");
|
||||
obj.info()->addParam(obj, "outerIterations", obj.outerIterations, false, 0, 0,
|
||||
"outer iterations (number of inner loops) used in the numerical scheme");
|
||||
obj.info()->addParam(obj, "gamma", obj.gamma, false, 0, 0,
|
||||
"coefficient for additional illumination variation term");
|
||||
obj.info()->addParam(obj, "useInitialFlow", obj.useInitialFlow))
|
||||
|
||||
} // namespace
|
||||
|
||||
Ptr<DenseOpticalFlow> cv::createOptFlow_DualTVL1()
|
||||
Ptr<DualTVL1OpticalFlow> cv::createOptFlow_DualTVL1()
|
||||
{
|
||||
return makePtr<OpticalFlowDual_TVL1>();
|
||||
}
|
||||
|
@ -82,11 +82,11 @@ OCL_TEST_P(OpticalFlowTVL1, Mat)
|
||||
cv::Mat flow; cv::UMat uflow;
|
||||
|
||||
//create algorithm
|
||||
cv::Ptr<cv::DenseOpticalFlow> alg = cv::createOptFlow_DualTVL1();
|
||||
cv::Ptr<cv::DualTVL1OpticalFlow> alg = cv::createOptFlow_DualTVL1();
|
||||
|
||||
//set parameters
|
||||
alg->set("scaleStep", scaleStep);
|
||||
alg->setInt("medianFiltering", medianFiltering);
|
||||
alg->setScaleStep(scaleStep);
|
||||
alg->setMedianFiltering(medianFiltering);
|
||||
|
||||
//create initial flow as result of algorithm calculation
|
||||
if (useInitFlow)
|
||||
@ -96,7 +96,7 @@ OCL_TEST_P(OpticalFlowTVL1, Mat)
|
||||
}
|
||||
|
||||
//set flag to use initial flow as it is ready to use
|
||||
alg->setBool("useInitialFlow", useInitFlow);
|
||||
alg->setUseInitialFlow(useInitFlow);
|
||||
|
||||
OCL_OFF(alg->calc(frame0, frame1, flow));
|
||||
OCL_ON(alg->calc(frame0, frame1, uflow));
|
||||
@ -114,4 +114,4 @@ OCL_INSTANTIATE_TEST_CASE_P(Video, OpticalFlowTVL1,
|
||||
|
||||
} } // namespace cvtest::ocl
|
||||
|
||||
#endif // HAVE_OPENCL
|
||||
#endif // HAVE_OPENCL
|
||||
|
@ -138,7 +138,7 @@ int main(int argc, char **argv)
|
||||
|
||||
Stats stats, akaze_stats, orb_stats;
|
||||
Ptr<AKAZE> akaze = AKAZE::create();
|
||||
akaze->set("threshold", akaze_thresh);
|
||||
akaze->setThreshold(akaze_thresh);
|
||||
Ptr<ORB> orb = ORB::create();
|
||||
orb->setMaxFeatures(stats.keypoints);
|
||||
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
|
||||
@ -163,7 +163,7 @@ int main(int argc, char **argv)
|
||||
akaze_draw_stats = stats;
|
||||
}
|
||||
|
||||
orb_tracker.getDetector()->set("nFeatures", stats.keypoints);
|
||||
orb->setMaxFeatures(stats.keypoints);
|
||||
orb_res = orb_tracker.process(frame, stats);
|
||||
orb_stats += stats;
|
||||
if(update_stats) {
|
||||
|
@ -26,32 +26,32 @@ using namespace cv::superres;
|
||||
cout << tm.getTimeSec() << " sec" << endl; \
|
||||
}
|
||||
|
||||
static Ptr<DenseOpticalFlowExt> createOptFlow(const string& name, bool useGpu)
|
||||
static Ptr<cv::superres::DenseOpticalFlowExt> createOptFlow(const string& name, bool useGpu)
|
||||
{
|
||||
if (name == "farneback")
|
||||
{
|
||||
if (useGpu)
|
||||
return createOptFlow_Farneback_CUDA();
|
||||
return cv::superres::createOptFlow_Farneback_CUDA();
|
||||
else
|
||||
return createOptFlow_Farneback();
|
||||
return cv::superres::createOptFlow_Farneback();
|
||||
}
|
||||
/*else if (name == "simple")
|
||||
return createOptFlow_Simple();*/
|
||||
else if (name == "tvl1")
|
||||
{
|
||||
if (useGpu)
|
||||
return createOptFlow_DualTVL1_CUDA();
|
||||
return cv::superres::createOptFlow_DualTVL1_CUDA();
|
||||
else
|
||||
return createOptFlow_DualTVL1();
|
||||
return cv::superres::createOptFlow_DualTVL1();
|
||||
}
|
||||
else if (name == "brox")
|
||||
return createOptFlow_Brox_CUDA();
|
||||
return cv::superres::createOptFlow_Brox_CUDA();
|
||||
else if (name == "pyrlk")
|
||||
return createOptFlow_PyrLK_CUDA();
|
||||
return cv::superres::createOptFlow_PyrLK_CUDA();
|
||||
else
|
||||
cerr << "Incorrect Optical Flow algorithm - " << name << endl;
|
||||
|
||||
return Ptr<DenseOpticalFlowExt>();
|
||||
return Ptr<cv::superres::DenseOpticalFlowExt>();
|
||||
}
|
||||
|
||||
int main(int argc, const char* argv[])
|
||||
@ -92,15 +92,15 @@ int main(int argc, const char* argv[])
|
||||
else
|
||||
superRes = createSuperResolution_BTVL1();
|
||||
|
||||
Ptr<DenseOpticalFlowExt> of = createOptFlow(optFlow, useCuda);
|
||||
Ptr<cv::superres::DenseOpticalFlowExt> of = createOptFlow(optFlow, useCuda);
|
||||
|
||||
if (of.empty())
|
||||
return EXIT_FAILURE;
|
||||
superRes->set("opticalFlow", of);
|
||||
superRes->setOpticalFlow(of);
|
||||
|
||||
superRes->set("scale", scale);
|
||||
superRes->set("iterations", iterations);
|
||||
superRes->set("temporalAreaRadius", temporalAreaRadius);
|
||||
superRes->setScale(scale);
|
||||
superRes->setIterations(iterations);
|
||||
superRes->setTemporalAreaRadius(temporalAreaRadius);
|
||||
|
||||
Ptr<FrameSource> frameSource;
|
||||
if (useCuda)
|
||||
|
@ -62,19 +62,17 @@ int main(int argc, char* argv[])
|
||||
cout << "FOUND " << keypoints2GPU.cols << " keypoints on second image" << endl;
|
||||
|
||||
// matching descriptors
|
||||
BFMatcher_CUDA matcher(surf.defaultNorm());
|
||||
GpuMat trainIdx, distance;
|
||||
matcher.matchSingle(descriptors1GPU, descriptors2GPU, trainIdx, distance);
|
||||
Ptr<cv::cuda::DescriptorMatcher> matcher = cv::cuda::DescriptorMatcher::createBFMatcher(surf.defaultNorm());
|
||||
vector<DMatch> matches;
|
||||
matcher->match(descriptors1GPU, descriptors2GPU, matches);
|
||||
|
||||
// downloading results
|
||||
vector<KeyPoint> keypoints1, keypoints2;
|
||||
vector<float> descriptors1, descriptors2;
|
||||
vector<DMatch> matches;
|
||||
surf.downloadKeypoints(keypoints1GPU, keypoints1);
|
||||
surf.downloadKeypoints(keypoints2GPU, keypoints2);
|
||||
surf.downloadDescriptors(descriptors1GPU, descriptors1);
|
||||
surf.downloadDescriptors(descriptors2GPU, descriptors2);
|
||||
BFMatcher_CUDA::matchDownload(trainIdx, distance, matches);
|
||||
|
||||
// drawing the results
|
||||
Mat img_matches;
|
||||
|
Loading…
Reference in New Issue
Block a user