Normalize line endings and whitespace
This commit is contained in:

committed by
Andrey Kamaev

parent
0442bca235
commit
81f826db2b
@@ -1118,7 +1118,7 @@ public:
|
||||
fmt = ((channels-1)<<8) + DataDepth<channel_type>::fmt,
|
||||
type = CV_MAKETYPE(depth, channels) };
|
||||
};
|
||||
|
||||
|
||||
template<typename _Tp, int cn> class DataType<Vec<_Tp, cn> >
|
||||
{
|
||||
public:
|
||||
@@ -2104,7 +2104,7 @@ CV_EXPORTS_AS(sumElems) Scalar sum(InputArray src);
|
||||
CV_EXPORTS_W int countNonZero( InputArray src );
|
||||
//! returns the list of locations of non-zero pixels
|
||||
CV_EXPORTS_W void findNonZero( InputArray src, OutputArray idx );
|
||||
|
||||
|
||||
//! computes mean value of selected array elements
|
||||
CV_EXPORTS_W Scalar mean(InputArray src, InputArray mask=noArray());
|
||||
//! computes mean value and standard deviation of all or selected array elements
|
||||
|
@@ -123,7 +123,7 @@ namespace cv
|
||||
typedef PtrStep<int> PtrStepi;
|
||||
|
||||
|
||||
#if defined __GNUC__
|
||||
#if defined __GNUC__
|
||||
#define __CV_GPU_DEPR_BEFORE__
|
||||
#define __CV_GPU_DEPR_AFTER__ __attribute__ ((deprecated))
|
||||
#elif defined(__MSVC__) //|| defined(__CUDACC__)
|
||||
@@ -140,7 +140,7 @@ namespace cv
|
||||
DevMem2D_() {}
|
||||
DevMem2D_(int rows_, int cols_, T* data_, size_t step_) : PtrStepSz<T>(rows_, cols_, data_, step_) {}
|
||||
|
||||
template <typename U>
|
||||
template <typename U>
|
||||
explicit __CV_GPU_DEPR_BEFORE__ DevMem2D_(const DevMem2D_<U>& d) : PtrStepSz<T>(d.rows, d.cols, (T*)d.data, d.step) {}
|
||||
} __CV_GPU_DEPR_AFTER__ ;
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,335 +1,335 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other GpuMaterials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_OPENGL_INTEROP_HPP__
|
||||
#define __OPENCV_OPENGL_INTEROP_HPP__
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include "opencv2/core/core.hpp"
|
||||
|
||||
namespace cv
|
||||
{
|
||||
//! Smart pointer for OpenGL buffer memory with reference counting.
|
||||
class CV_EXPORTS GlBuffer
|
||||
{
|
||||
public:
|
||||
enum Usage
|
||||
{
|
||||
ARRAY_BUFFER = 0x8892, // buffer will use for OpenGL arrays (vertices, colors, normals, etc)
|
||||
TEXTURE_BUFFER = 0x88EC // buffer will ise for OpenGL textures
|
||||
};
|
||||
|
||||
//! create empty buffer
|
||||
explicit GlBuffer(Usage usage);
|
||||
|
||||
//! create buffer
|
||||
GlBuffer(int rows, int cols, int type, Usage usage);
|
||||
GlBuffer(Size size, int type, Usage usage);
|
||||
|
||||
//! copy from host/device memory
|
||||
GlBuffer(InputArray mat, Usage usage);
|
||||
|
||||
void create(int rows, int cols, int type, Usage usage);
|
||||
void create(Size size, int type, Usage usage);
|
||||
void create(int rows, int cols, int type);
|
||||
void create(Size size, int type);
|
||||
|
||||
void release();
|
||||
|
||||
//! copy from host/device memory
|
||||
void copyFrom(InputArray mat);
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
//! map to host memory
|
||||
Mat mapHost();
|
||||
void unmapHost();
|
||||
|
||||
//! map to device memory
|
||||
gpu::GpuMat mapDevice();
|
||||
void unmapDevice();
|
||||
|
||||
inline int rows() const { return rows_; }
|
||||
inline int cols() const { return cols_; }
|
||||
inline Size size() const { return Size(cols_, rows_); }
|
||||
inline bool empty() const { return rows_ == 0 || cols_ == 0; }
|
||||
|
||||
inline int type() const { return type_; }
|
||||
inline int depth() const { return CV_MAT_DEPTH(type_); }
|
||||
inline int channels() const { return CV_MAT_CN(type_); }
|
||||
inline int elemSize() const { return CV_ELEM_SIZE(type_); }
|
||||
inline int elemSize1() const { return CV_ELEM_SIZE1(type_); }
|
||||
|
||||
inline Usage usage() const { return usage_; }
|
||||
|
||||
class Impl;
|
||||
private:
|
||||
int rows_;
|
||||
int cols_;
|
||||
int type_;
|
||||
Usage usage_;
|
||||
|
||||
Ptr<Impl> impl_;
|
||||
};
|
||||
|
||||
template <> CV_EXPORTS void Ptr<GlBuffer::Impl>::delete_obj();
|
||||
|
||||
//! Smart pointer for OpenGL 2d texture memory with reference counting.
|
||||
class CV_EXPORTS GlTexture
|
||||
{
|
||||
public:
|
||||
//! create empty texture
|
||||
GlTexture();
|
||||
|
||||
//! create texture
|
||||
GlTexture(int rows, int cols, int type);
|
||||
GlTexture(Size size, int type);
|
||||
|
||||
//! copy from host/device memory
|
||||
explicit GlTexture(InputArray mat, bool bgra = true);
|
||||
|
||||
void create(int rows, int cols, int type);
|
||||
void create(Size size, int type);
|
||||
void release();
|
||||
|
||||
//! copy from host/device memory
|
||||
void copyFrom(InputArray mat, bool bgra = true);
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
inline int rows() const { return rows_; }
|
||||
inline int cols() const { return cols_; }
|
||||
inline Size size() const { return Size(cols_, rows_); }
|
||||
inline bool empty() const { return rows_ == 0 || cols_ == 0; }
|
||||
|
||||
inline int type() const { return type_; }
|
||||
inline int depth() const { return CV_MAT_DEPTH(type_); }
|
||||
inline int channels() const { return CV_MAT_CN(type_); }
|
||||
inline int elemSize() const { return CV_ELEM_SIZE(type_); }
|
||||
inline int elemSize1() const { return CV_ELEM_SIZE1(type_); }
|
||||
|
||||
class Impl;
|
||||
private:
|
||||
int rows_;
|
||||
int cols_;
|
||||
int type_;
|
||||
|
||||
Ptr<Impl> impl_;
|
||||
GlBuffer buf_;
|
||||
};
|
||||
|
||||
template <> CV_EXPORTS void Ptr<GlTexture::Impl>::delete_obj();
|
||||
|
||||
//! OpenGL Arrays
|
||||
class CV_EXPORTS GlArrays
|
||||
{
|
||||
public:
|
||||
inline GlArrays()
|
||||
: vertex_(GlBuffer::ARRAY_BUFFER), color_(GlBuffer::ARRAY_BUFFER), bgra_(true), normal_(GlBuffer::ARRAY_BUFFER), texCoord_(GlBuffer::ARRAY_BUFFER)
|
||||
{
|
||||
}
|
||||
|
||||
void setVertexArray(InputArray vertex);
|
||||
inline void resetVertexArray() { vertex_.release(); }
|
||||
|
||||
void setColorArray(InputArray color, bool bgra = true);
|
||||
inline void resetColorArray() { color_.release(); }
|
||||
|
||||
void setNormalArray(InputArray normal);
|
||||
inline void resetNormalArray() { normal_.release(); }
|
||||
|
||||
void setTexCoordArray(InputArray texCoord);
|
||||
inline void resetTexCoordArray() { texCoord_.release(); }
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
inline int rows() const { return vertex_.rows(); }
|
||||
inline int cols() const { return vertex_.cols(); }
|
||||
inline Size size() const { return vertex_.size(); }
|
||||
inline bool empty() const { return vertex_.empty(); }
|
||||
|
||||
private:
|
||||
GlBuffer vertex_;
|
||||
GlBuffer color_;
|
||||
bool bgra_;
|
||||
GlBuffer normal_;
|
||||
GlBuffer texCoord_;
|
||||
};
|
||||
|
||||
//! OpenGL Font
|
||||
class CV_EXPORTS GlFont
|
||||
{
|
||||
public:
|
||||
enum Weight
|
||||
{
|
||||
WEIGHT_LIGHT = 300,
|
||||
WEIGHT_NORMAL = 400,
|
||||
WEIGHT_SEMIBOLD = 600,
|
||||
WEIGHT_BOLD = 700,
|
||||
WEIGHT_BLACK = 900
|
||||
};
|
||||
|
||||
enum Style
|
||||
{
|
||||
STYLE_NORMAL = 0,
|
||||
STYLE_ITALIC = 1,
|
||||
STYLE_UNDERLINE = 2
|
||||
};
|
||||
|
||||
static Ptr<GlFont> get(const std::string& family, int height = 12, Weight weight = WEIGHT_NORMAL, Style style = STYLE_NORMAL);
|
||||
|
||||
void draw(const char* str, size_t len) const;
|
||||
|
||||
inline const std::string& family() const { return family_; }
|
||||
inline int height() const { return height_; }
|
||||
inline Weight weight() const { return weight_; }
|
||||
inline Style style() const { return style_; }
|
||||
|
||||
private:
|
||||
GlFont(const std::string& family, int height, Weight weight, Style style);
|
||||
|
||||
std::string family_;
|
||||
int height_;
|
||||
Weight weight_;
|
||||
Style style_;
|
||||
|
||||
unsigned int base_;
|
||||
|
||||
GlFont(const GlFont&);
|
||||
GlFont& operator =(const GlFont&);
|
||||
};
|
||||
|
||||
//! render functions
|
||||
|
||||
//! render texture rectangle in window
|
||||
CV_EXPORTS void render(const GlTexture& tex,
|
||||
Rect_<double> wndRect = Rect_<double>(0.0, 0.0, 1.0, 1.0),
|
||||
Rect_<double> texRect = Rect_<double>(0.0, 0.0, 1.0, 1.0));
|
||||
|
||||
//! render mode
|
||||
namespace RenderMode {
|
||||
enum {
|
||||
POINTS = 0x0000,
|
||||
LINES = 0x0001,
|
||||
LINE_LOOP = 0x0002,
|
||||
LINE_STRIP = 0x0003,
|
||||
TRIANGLES = 0x0004,
|
||||
TRIANGLE_STRIP = 0x0005,
|
||||
TRIANGLE_FAN = 0x0006,
|
||||
QUADS = 0x0007,
|
||||
QUAD_STRIP = 0x0008,
|
||||
POLYGON = 0x0009
|
||||
};
|
||||
}
|
||||
|
||||
//! render OpenGL arrays
|
||||
CV_EXPORTS void render(const GlArrays& arr, int mode = RenderMode::POINTS, Scalar color = Scalar::all(255));
|
||||
|
||||
CV_EXPORTS void render(const std::string& str, const Ptr<GlFont>& font, Scalar color, Point2d pos);
|
||||
|
||||
//! OpenGL camera
|
||||
class CV_EXPORTS GlCamera
|
||||
{
|
||||
public:
|
||||
GlCamera();
|
||||
|
||||
void lookAt(Point3d eye, Point3d center, Point3d up);
|
||||
void setCameraPos(Point3d pos, double yaw, double pitch, double roll);
|
||||
|
||||
void setScale(Point3d scale);
|
||||
|
||||
void setProjectionMatrix(const Mat& projectionMatrix, bool transpose = true);
|
||||
void setPerspectiveProjection(double fov, double aspect, double zNear, double zFar);
|
||||
void setOrthoProjection(double left, double right, double bottom, double top, double zNear, double zFar);
|
||||
|
||||
void setupProjectionMatrix() const;
|
||||
void setupModelViewMatrix() const;
|
||||
|
||||
private:
|
||||
Point3d eye_;
|
||||
Point3d center_;
|
||||
Point3d up_;
|
||||
|
||||
Point3d pos_;
|
||||
double yaw_;
|
||||
double pitch_;
|
||||
double roll_;
|
||||
|
||||
bool useLookAtParams_;
|
||||
|
||||
Point3d scale_;
|
||||
|
||||
Mat projectionMatrix_;
|
||||
|
||||
double fov_;
|
||||
double aspect_;
|
||||
|
||||
double left_;
|
||||
double right_;
|
||||
double bottom_;
|
||||
double top_;
|
||||
|
||||
double zNear_;
|
||||
double zFar_;
|
||||
|
||||
bool perspectiveProjection_;
|
||||
};
|
||||
|
||||
inline void GlBuffer::create(Size _size, int _type, Usage _usage) { create(_size.height, _size.width, _type, _usage); }
|
||||
inline void GlBuffer::create(int _rows, int _cols, int _type) { create(_rows, _cols, _type, usage()); }
|
||||
inline void GlBuffer::create(Size _size, int _type) { create(_size.height, _size.width, _type, usage()); }
|
||||
inline void GlTexture::create(Size _size, int _type) { create(_size.height, _size.width, _type); }
|
||||
|
||||
namespace gpu
|
||||
{
|
||||
//! set a CUDA device to use OpenGL interoperability
|
||||
CV_EXPORTS void setGlDevice(int device = 0);
|
||||
}
|
||||
} // namespace cv
|
||||
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // __OPENCV_OPENGL_INTEROP_HPP__
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other GpuMaterials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_OPENGL_INTEROP_HPP__
|
||||
#define __OPENCV_OPENGL_INTEROP_HPP__
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include "opencv2/core/core.hpp"
|
||||
|
||||
namespace cv
|
||||
{
|
||||
//! Smart pointer for OpenGL buffer memory with reference counting.
|
||||
class CV_EXPORTS GlBuffer
|
||||
{
|
||||
public:
|
||||
enum Usage
|
||||
{
|
||||
ARRAY_BUFFER = 0x8892, // buffer will use for OpenGL arrays (vertices, colors, normals, etc)
|
||||
TEXTURE_BUFFER = 0x88EC // buffer will ise for OpenGL textures
|
||||
};
|
||||
|
||||
//! create empty buffer
|
||||
explicit GlBuffer(Usage usage);
|
||||
|
||||
//! create buffer
|
||||
GlBuffer(int rows, int cols, int type, Usage usage);
|
||||
GlBuffer(Size size, int type, Usage usage);
|
||||
|
||||
//! copy from host/device memory
|
||||
GlBuffer(InputArray mat, Usage usage);
|
||||
|
||||
void create(int rows, int cols, int type, Usage usage);
|
||||
void create(Size size, int type, Usage usage);
|
||||
void create(int rows, int cols, int type);
|
||||
void create(Size size, int type);
|
||||
|
||||
void release();
|
||||
|
||||
//! copy from host/device memory
|
||||
void copyFrom(InputArray mat);
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
//! map to host memory
|
||||
Mat mapHost();
|
||||
void unmapHost();
|
||||
|
||||
//! map to device memory
|
||||
gpu::GpuMat mapDevice();
|
||||
void unmapDevice();
|
||||
|
||||
inline int rows() const { return rows_; }
|
||||
inline int cols() const { return cols_; }
|
||||
inline Size size() const { return Size(cols_, rows_); }
|
||||
inline bool empty() const { return rows_ == 0 || cols_ == 0; }
|
||||
|
||||
inline int type() const { return type_; }
|
||||
inline int depth() const { return CV_MAT_DEPTH(type_); }
|
||||
inline int channels() const { return CV_MAT_CN(type_); }
|
||||
inline int elemSize() const { return CV_ELEM_SIZE(type_); }
|
||||
inline int elemSize1() const { return CV_ELEM_SIZE1(type_); }
|
||||
|
||||
inline Usage usage() const { return usage_; }
|
||||
|
||||
class Impl;
|
||||
private:
|
||||
int rows_;
|
||||
int cols_;
|
||||
int type_;
|
||||
Usage usage_;
|
||||
|
||||
Ptr<Impl> impl_;
|
||||
};
|
||||
|
||||
template <> CV_EXPORTS void Ptr<GlBuffer::Impl>::delete_obj();
|
||||
|
||||
//! Smart pointer for OpenGL 2d texture memory with reference counting.
|
||||
class CV_EXPORTS GlTexture
|
||||
{
|
||||
public:
|
||||
//! create empty texture
|
||||
GlTexture();
|
||||
|
||||
//! create texture
|
||||
GlTexture(int rows, int cols, int type);
|
||||
GlTexture(Size size, int type);
|
||||
|
||||
//! copy from host/device memory
|
||||
explicit GlTexture(InputArray mat, bool bgra = true);
|
||||
|
||||
void create(int rows, int cols, int type);
|
||||
void create(Size size, int type);
|
||||
void release();
|
||||
|
||||
//! copy from host/device memory
|
||||
void copyFrom(InputArray mat, bool bgra = true);
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
inline int rows() const { return rows_; }
|
||||
inline int cols() const { return cols_; }
|
||||
inline Size size() const { return Size(cols_, rows_); }
|
||||
inline bool empty() const { return rows_ == 0 || cols_ == 0; }
|
||||
|
||||
inline int type() const { return type_; }
|
||||
inline int depth() const { return CV_MAT_DEPTH(type_); }
|
||||
inline int channels() const { return CV_MAT_CN(type_); }
|
||||
inline int elemSize() const { return CV_ELEM_SIZE(type_); }
|
||||
inline int elemSize1() const { return CV_ELEM_SIZE1(type_); }
|
||||
|
||||
class Impl;
|
||||
private:
|
||||
int rows_;
|
||||
int cols_;
|
||||
int type_;
|
||||
|
||||
Ptr<Impl> impl_;
|
||||
GlBuffer buf_;
|
||||
};
|
||||
|
||||
template <> CV_EXPORTS void Ptr<GlTexture::Impl>::delete_obj();
|
||||
|
||||
//! OpenGL Arrays
|
||||
class CV_EXPORTS GlArrays
|
||||
{
|
||||
public:
|
||||
inline GlArrays()
|
||||
: vertex_(GlBuffer::ARRAY_BUFFER), color_(GlBuffer::ARRAY_BUFFER), bgra_(true), normal_(GlBuffer::ARRAY_BUFFER), texCoord_(GlBuffer::ARRAY_BUFFER)
|
||||
{
|
||||
}
|
||||
|
||||
void setVertexArray(InputArray vertex);
|
||||
inline void resetVertexArray() { vertex_.release(); }
|
||||
|
||||
void setColorArray(InputArray color, bool bgra = true);
|
||||
inline void resetColorArray() { color_.release(); }
|
||||
|
||||
void setNormalArray(InputArray normal);
|
||||
inline void resetNormalArray() { normal_.release(); }
|
||||
|
||||
void setTexCoordArray(InputArray texCoord);
|
||||
inline void resetTexCoordArray() { texCoord_.release(); }
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
inline int rows() const { return vertex_.rows(); }
|
||||
inline int cols() const { return vertex_.cols(); }
|
||||
inline Size size() const { return vertex_.size(); }
|
||||
inline bool empty() const { return vertex_.empty(); }
|
||||
|
||||
private:
|
||||
GlBuffer vertex_;
|
||||
GlBuffer color_;
|
||||
bool bgra_;
|
||||
GlBuffer normal_;
|
||||
GlBuffer texCoord_;
|
||||
};
|
||||
|
||||
//! OpenGL Font
|
||||
class CV_EXPORTS GlFont
|
||||
{
|
||||
public:
|
||||
enum Weight
|
||||
{
|
||||
WEIGHT_LIGHT = 300,
|
||||
WEIGHT_NORMAL = 400,
|
||||
WEIGHT_SEMIBOLD = 600,
|
||||
WEIGHT_BOLD = 700,
|
||||
WEIGHT_BLACK = 900
|
||||
};
|
||||
|
||||
enum Style
|
||||
{
|
||||
STYLE_NORMAL = 0,
|
||||
STYLE_ITALIC = 1,
|
||||
STYLE_UNDERLINE = 2
|
||||
};
|
||||
|
||||
static Ptr<GlFont> get(const std::string& family, int height = 12, Weight weight = WEIGHT_NORMAL, Style style = STYLE_NORMAL);
|
||||
|
||||
void draw(const char* str, size_t len) const;
|
||||
|
||||
inline const std::string& family() const { return family_; }
|
||||
inline int height() const { return height_; }
|
||||
inline Weight weight() const { return weight_; }
|
||||
inline Style style() const { return style_; }
|
||||
|
||||
private:
|
||||
GlFont(const std::string& family, int height, Weight weight, Style style);
|
||||
|
||||
std::string family_;
|
||||
int height_;
|
||||
Weight weight_;
|
||||
Style style_;
|
||||
|
||||
unsigned int base_;
|
||||
|
||||
GlFont(const GlFont&);
|
||||
GlFont& operator =(const GlFont&);
|
||||
};
|
||||
|
||||
//! render functions
|
||||
|
||||
//! render texture rectangle in window
|
||||
CV_EXPORTS void render(const GlTexture& tex,
|
||||
Rect_<double> wndRect = Rect_<double>(0.0, 0.0, 1.0, 1.0),
|
||||
Rect_<double> texRect = Rect_<double>(0.0, 0.0, 1.0, 1.0));
|
||||
|
||||
//! render mode
|
||||
namespace RenderMode {
|
||||
enum {
|
||||
POINTS = 0x0000,
|
||||
LINES = 0x0001,
|
||||
LINE_LOOP = 0x0002,
|
||||
LINE_STRIP = 0x0003,
|
||||
TRIANGLES = 0x0004,
|
||||
TRIANGLE_STRIP = 0x0005,
|
||||
TRIANGLE_FAN = 0x0006,
|
||||
QUADS = 0x0007,
|
||||
QUAD_STRIP = 0x0008,
|
||||
POLYGON = 0x0009
|
||||
};
|
||||
}
|
||||
|
||||
//! render OpenGL arrays
|
||||
CV_EXPORTS void render(const GlArrays& arr, int mode = RenderMode::POINTS, Scalar color = Scalar::all(255));
|
||||
|
||||
CV_EXPORTS void render(const std::string& str, const Ptr<GlFont>& font, Scalar color, Point2d pos);
|
||||
|
||||
//! OpenGL camera
|
||||
class CV_EXPORTS GlCamera
|
||||
{
|
||||
public:
|
||||
GlCamera();
|
||||
|
||||
void lookAt(Point3d eye, Point3d center, Point3d up);
|
||||
void setCameraPos(Point3d pos, double yaw, double pitch, double roll);
|
||||
|
||||
void setScale(Point3d scale);
|
||||
|
||||
void setProjectionMatrix(const Mat& projectionMatrix, bool transpose = true);
|
||||
void setPerspectiveProjection(double fov, double aspect, double zNear, double zFar);
|
||||
void setOrthoProjection(double left, double right, double bottom, double top, double zNear, double zFar);
|
||||
|
||||
void setupProjectionMatrix() const;
|
||||
void setupModelViewMatrix() const;
|
||||
|
||||
private:
|
||||
Point3d eye_;
|
||||
Point3d center_;
|
||||
Point3d up_;
|
||||
|
||||
Point3d pos_;
|
||||
double yaw_;
|
||||
double pitch_;
|
||||
double roll_;
|
||||
|
||||
bool useLookAtParams_;
|
||||
|
||||
Point3d scale_;
|
||||
|
||||
Mat projectionMatrix_;
|
||||
|
||||
double fov_;
|
||||
double aspect_;
|
||||
|
||||
double left_;
|
||||
double right_;
|
||||
double bottom_;
|
||||
double top_;
|
||||
|
||||
double zNear_;
|
||||
double zFar_;
|
||||
|
||||
bool perspectiveProjection_;
|
||||
};
|
||||
|
||||
inline void GlBuffer::create(Size _size, int _type, Usage _usage) { create(_size.height, _size.width, _type, _usage); }
|
||||
inline void GlBuffer::create(int _rows, int _cols, int _type) { create(_rows, _cols, _type, usage()); }
|
||||
inline void GlBuffer::create(Size _size, int _type) { create(_size.height, _size.width, _type, usage()); }
|
||||
inline void GlTexture::create(Size _size, int _type) { create(_size.height, _size.width, _type); }
|
||||
|
||||
namespace gpu
|
||||
{
|
||||
//! set a CUDA device to use OpenGL interoperability
|
||||
CV_EXPORTS void setGlDevice(int device = 0);
|
||||
}
|
||||
} // namespace cv
|
||||
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // __OPENCV_OPENGL_INTEROP_HPP__
|
||||
|
@@ -2641,7 +2641,7 @@ template<typename _Tp> template<typename _Tp2> Ptr<_Tp>::Ptr(const Ptr<_Tp2>& p)
|
||||
{
|
||||
if (p.empty())
|
||||
return;
|
||||
|
||||
|
||||
_Tp* p_casted = dynamic_cast<_Tp*>(p.obj);
|
||||
if (!p_casted)
|
||||
return;
|
||||
|
@@ -1,8 +1,8 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to
|
||||
// this license. If you do not agree to this license, do not download,
|
||||
// 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
|
||||
@@ -11,7 +11,7 @@
|
||||
// Copyright (C) 2008, Google, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
@@ -25,11 +25,11 @@
|
||||
// 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 the Intel Corporation or contributors be
|
||||
// liable for any direct, indirect, incidental, special, exemplary, or
|
||||
// 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 the Intel Corporation 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
|
||||
|
@@ -6,11 +6,11 @@ using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
#define TYPICAL_MAT_SIZES_ABS TYPICAL_MAT_SIZES
|
||||
#define TYPICAL_MAT_SIZES_ABS TYPICAL_MAT_SIZES
|
||||
#define TYPICAL_MAT_TYPES_ABS CV_8SC1, CV_8SC4, CV_32SC1, CV_32FC1
|
||||
#define TYPICAL_MATS_ABS testing::Combine( testing::Values( TYPICAL_MAT_SIZES_ABS), testing::Values( TYPICAL_MAT_TYPES_ABS) )
|
||||
|
||||
PERF_TEST_P(Size_MatType, abs, TYPICAL_MATS_ABS)
|
||||
PERF_TEST_P(Size_MatType, abs, TYPICAL_MATS_ABS)
|
||||
{
|
||||
Size sz = get<0>(GetParam());
|
||||
int type = get<1>(GetParam());
|
||||
|
@@ -1,29 +1,29 @@
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
#define TYPICAL_MAT_TYPES_ADWEIGHTED CV_8UC1, CV_8UC4, CV_8SC1, CV_16UC1, CV_16SC1, CV_32SC1, CV_32SC4
|
||||
#define TYPICAL_MATS_ADWEIGHTED testing::Combine(testing::Values(szVGA, sz720p, sz1080p), testing::Values(TYPICAL_MAT_TYPES_ADWEIGHTED))
|
||||
|
||||
PERF_TEST_P(Size_MatType, addWeighted, TYPICAL_MATS_ADWEIGHTED)
|
||||
{
|
||||
Size size = get<0>(GetParam());
|
||||
int type = get<1>(GetParam());
|
||||
Mat src1(size, type);
|
||||
Mat src2(size, type);
|
||||
double alpha = 3.75;
|
||||
double beta = -0.125;
|
||||
double gamma = 100.0;
|
||||
|
||||
Mat dst(size, type);
|
||||
|
||||
declare.in(src1, src2, dst, WARMUP_RNG).out(dst);
|
||||
|
||||
TEST_CYCLE() cv::addWeighted( src1, alpha, src2, beta, gamma, dst, dst.type() );
|
||||
|
||||
SANITY_CHECK(dst);
|
||||
}
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
#define TYPICAL_MAT_TYPES_ADWEIGHTED CV_8UC1, CV_8UC4, CV_8SC1, CV_16UC1, CV_16SC1, CV_32SC1, CV_32SC4
|
||||
#define TYPICAL_MATS_ADWEIGHTED testing::Combine(testing::Values(szVGA, sz720p, sz1080p), testing::Values(TYPICAL_MAT_TYPES_ADWEIGHTED))
|
||||
|
||||
PERF_TEST_P(Size_MatType, addWeighted, TYPICAL_MATS_ADWEIGHTED)
|
||||
{
|
||||
Size size = get<0>(GetParam());
|
||||
int type = get<1>(GetParam());
|
||||
Mat src1(size, type);
|
||||
Mat src2(size, type);
|
||||
double alpha = 3.75;
|
||||
double beta = -0.125;
|
||||
double gamma = 100.0;
|
||||
|
||||
Mat dst(size, type);
|
||||
|
||||
declare.in(src1, src2, dst, WARMUP_RNG).out(dst);
|
||||
|
||||
TEST_CYCLE() cv::addWeighted( src1, alpha, src2, beta, gamma, dst, dst.type() );
|
||||
|
||||
SANITY_CHECK(dst);
|
||||
}
|
||||
|
@@ -1,36 +1,36 @@
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
typedef std::tr1::tuple<Size, MatType, MatType, int, double> Size_DepthSrc_DepthDst_Channels_alpha_t;
|
||||
typedef perf::TestBaseWithParam<Size_DepthSrc_DepthDst_Channels_alpha_t> Size_DepthSrc_DepthDst_Channels_alpha;
|
||||
|
||||
PERF_TEST_P( Size_DepthSrc_DepthDst_Channels_alpha, convertTo,
|
||||
testing::Combine
|
||||
(
|
||||
testing::Values(szVGA, sz1080p),
|
||||
testing::Values(CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F),
|
||||
testing::Values(CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F),
|
||||
testing::Values(1, 4),
|
||||
testing::Values(1.0, 1./255)
|
||||
)
|
||||
)
|
||||
{
|
||||
Size sz = get<0>(GetParam());
|
||||
int depthSrc = get<1>(GetParam());
|
||||
int depthDst = get<2>(GetParam());
|
||||
int channels = get<3>(GetParam());
|
||||
double alpha = get<4>(GetParam());
|
||||
|
||||
Mat src(sz, CV_MAKETYPE(depthSrc, channels));
|
||||
randu(src, 0, 255);
|
||||
Mat dst(sz, CV_MAKETYPE(depthDst, channels));
|
||||
|
||||
TEST_CYCLE() src.convertTo(dst, depthDst, alpha);
|
||||
|
||||
SANITY_CHECK(dst, alpha == 1.0 ? 1e-12 : 1e-7);
|
||||
}
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
typedef std::tr1::tuple<Size, MatType, MatType, int, double> Size_DepthSrc_DepthDst_Channels_alpha_t;
|
||||
typedef perf::TestBaseWithParam<Size_DepthSrc_DepthDst_Channels_alpha_t> Size_DepthSrc_DepthDst_Channels_alpha;
|
||||
|
||||
PERF_TEST_P( Size_DepthSrc_DepthDst_Channels_alpha, convertTo,
|
||||
testing::Combine
|
||||
(
|
||||
testing::Values(szVGA, sz1080p),
|
||||
testing::Values(CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F),
|
||||
testing::Values(CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F),
|
||||
testing::Values(1, 4),
|
||||
testing::Values(1.0, 1./255)
|
||||
)
|
||||
)
|
||||
{
|
||||
Size sz = get<0>(GetParam());
|
||||
int depthSrc = get<1>(GetParam());
|
||||
int depthDst = get<2>(GetParam());
|
||||
int channels = get<3>(GetParam());
|
||||
double alpha = get<4>(GetParam());
|
||||
|
||||
Mat src(sz, CV_MAKETYPE(depthSrc, channels));
|
||||
randu(src, 0, 255);
|
||||
Mat dst(sz, CV_MAKETYPE(depthDst, channels));
|
||||
|
||||
TEST_CYCLE() src.convertTo(dst, depthDst, alpha);
|
||||
|
||||
SANITY_CHECK(dst, alpha == 1.0 ? 1e-12 : 1e-7);
|
||||
}
|
||||
|
@@ -1,26 +1,26 @@
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
#define MAT_TYPES_DFT CV_32FC1, CV_64FC1
|
||||
#define MAT_SIZES_DFT sz1080p, sz2K
|
||||
#define TEST_MATS_DFT testing::Combine(testing::Values(MAT_SIZES_DFT), testing::Values(MAT_TYPES_DFT))
|
||||
|
||||
PERF_TEST_P(Size_MatType, dft, TEST_MATS_DFT)
|
||||
{
|
||||
Size sz = get<0>(GetParam());
|
||||
int type = get<1>(GetParam());
|
||||
|
||||
Mat src(sz, type);
|
||||
Mat dst(sz, type);
|
||||
|
||||
declare.in(src, WARMUP_RNG).time(60);
|
||||
|
||||
TEST_CYCLE() dft(src, dst);
|
||||
|
||||
SANITY_CHECK(dst, 1e-5);
|
||||
}
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
#define MAT_TYPES_DFT CV_32FC1, CV_64FC1
|
||||
#define MAT_SIZES_DFT sz1080p, sz2K
|
||||
#define TEST_MATS_DFT testing::Combine(testing::Values(MAT_SIZES_DFT), testing::Values(MAT_TYPES_DFT))
|
||||
|
||||
PERF_TEST_P(Size_MatType, dft, TEST_MATS_DFT)
|
||||
{
|
||||
Size sz = get<0>(GetParam());
|
||||
int type = get<1>(GetParam());
|
||||
|
||||
Mat src(sz, type);
|
||||
Mat dst(sz, type);
|
||||
|
||||
declare.in(src, WARMUP_RNG).time(60);
|
||||
|
||||
TEST_CYCLE() dft(src, dst);
|
||||
|
||||
SANITY_CHECK(dst, 1e-5);
|
||||
}
|
||||
|
@@ -1,30 +1,30 @@
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
typedef tr1::tuple<MatType, int> MatType_Length_t;
|
||||
typedef TestBaseWithParam<MatType_Length_t> MatType_Length;
|
||||
|
||||
PERF_TEST_P( MatType_Length, dot,
|
||||
testing::Combine(
|
||||
testing::Values( CV_8UC1, CV_32SC1, CV_32FC1 ),
|
||||
testing::Values( 32, 64, 128, 256, 512, 1024 )
|
||||
))
|
||||
{
|
||||
int type = get<0>(GetParam());
|
||||
int size = get<1>(GetParam());
|
||||
Mat a(size, size, type);
|
||||
Mat b(size, size, type);
|
||||
|
||||
declare.in(a, b, WARMUP_RNG);
|
||||
|
||||
double product;
|
||||
|
||||
TEST_CYCLE_N(1000) product = a.dot(b);
|
||||
|
||||
SANITY_CHECK(product, 1e-6, ERROR_RELATIVE);
|
||||
}
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
typedef tr1::tuple<MatType, int> MatType_Length_t;
|
||||
typedef TestBaseWithParam<MatType_Length_t> MatType_Length;
|
||||
|
||||
PERF_TEST_P( MatType_Length, dot,
|
||||
testing::Combine(
|
||||
testing::Values( CV_8UC1, CV_32SC1, CV_32FC1 ),
|
||||
testing::Values( 32, 64, 128, 256, 512, 1024 )
|
||||
))
|
||||
{
|
||||
int type = get<0>(GetParam());
|
||||
int size = get<1>(GetParam());
|
||||
Mat a(size, size, type);
|
||||
Mat b(size, size, type);
|
||||
|
||||
declare.in(a, b, WARMUP_RNG);
|
||||
|
||||
double product;
|
||||
|
||||
TEST_CYCLE_N(1000) product = a.dot(b);
|
||||
|
||||
SANITY_CHECK(product, 1e-6, ERROR_RELATIVE);
|
||||
}
|
||||
|
@@ -1,26 +1,26 @@
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
#define TYPICAL_MAT_TYPES_INRANGE CV_8UC1, CV_8UC4, CV_8SC1, CV_16UC1, CV_16SC1, CV_32SC1, CV_32FC1, CV_32FC4
|
||||
#define TYPICAL_MATS_INRANGE testing::Combine(testing::Values(szVGA, sz720p, sz1080p), testing::Values(TYPICAL_MAT_TYPES_INRANGE))
|
||||
|
||||
PERF_TEST_P(Size_MatType, inRange, TYPICAL_MATS_INRANGE)
|
||||
{
|
||||
Size size = get<0>(GetParam());
|
||||
int type = get<1>(GetParam());
|
||||
Mat src1(size, type);
|
||||
Mat src2(size, type);
|
||||
Mat src3(size, type);
|
||||
Mat dst(size, type);
|
||||
|
||||
declare.in(src1, src2, src3, WARMUP_RNG).out(dst);
|
||||
|
||||
TEST_CYCLE() inRange( src1, src2, src3, dst );
|
||||
|
||||
SANITY_CHECK(dst);
|
||||
}
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
#define TYPICAL_MAT_TYPES_INRANGE CV_8UC1, CV_8UC4, CV_8SC1, CV_16UC1, CV_16SC1, CV_32SC1, CV_32FC1, CV_32FC4
|
||||
#define TYPICAL_MATS_INRANGE testing::Combine(testing::Values(szVGA, sz720p, sz1080p), testing::Values(TYPICAL_MAT_TYPES_INRANGE))
|
||||
|
||||
PERF_TEST_P(Size_MatType, inRange, TYPICAL_MATS_INRANGE)
|
||||
{
|
||||
Size size = get<0>(GetParam());
|
||||
int type = get<1>(GetParam());
|
||||
Mat src1(size, type);
|
||||
Mat src2(size, type);
|
||||
Mat src3(size, type);
|
||||
Mat dst(size, type);
|
||||
|
||||
declare.in(src1, src2, src3, WARMUP_RNG).out(dst);
|
||||
|
||||
TEST_CYCLE() inRange( src1, src2, src3, dst );
|
||||
|
||||
SANITY_CHECK(dst);
|
||||
}
|
||||
|
@@ -1,36 +1,36 @@
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
typedef std::tr1::tuple<Size, MatType, int> Size_SrcDepth_DstChannels_t;
|
||||
typedef perf::TestBaseWithParam<Size_SrcDepth_DstChannels_t> Size_SrcDepth_DstChannels;
|
||||
|
||||
PERF_TEST_P( Size_SrcDepth_DstChannels, merge,
|
||||
testing::Combine
|
||||
(
|
||||
testing::Values(TYPICAL_MAT_SIZES),
|
||||
testing::Values(CV_8U, CV_16S, CV_32S, CV_32F, CV_64F),
|
||||
testing::Values(2, 3, 4)
|
||||
)
|
||||
)
|
||||
{
|
||||
Size sz = get<0>(GetParam());
|
||||
int srcDepth = get<1>(GetParam());
|
||||
int dstChannels = get<2>(GetParam());
|
||||
|
||||
vector<Mat> mv;
|
||||
for( int i = 0; i < dstChannels; ++i )
|
||||
{
|
||||
mv.push_back( Mat(sz, CV_MAKETYPE(srcDepth, 1)) );
|
||||
randu(mv[i], 0, 255);
|
||||
}
|
||||
|
||||
Mat dst;
|
||||
TEST_CYCLE() merge( (vector<Mat> &)mv, dst );
|
||||
|
||||
SANITY_CHECK(dst, 1e-12);
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
typedef std::tr1::tuple<Size, MatType, int> Size_SrcDepth_DstChannels_t;
|
||||
typedef perf::TestBaseWithParam<Size_SrcDepth_DstChannels_t> Size_SrcDepth_DstChannels;
|
||||
|
||||
PERF_TEST_P( Size_SrcDepth_DstChannels, merge,
|
||||
testing::Combine
|
||||
(
|
||||
testing::Values(TYPICAL_MAT_SIZES),
|
||||
testing::Values(CV_8U, CV_16S, CV_32S, CV_32F, CV_64F),
|
||||
testing::Values(2, 3, 4)
|
||||
)
|
||||
)
|
||||
{
|
||||
Size sz = get<0>(GetParam());
|
||||
int srcDepth = get<1>(GetParam());
|
||||
int dstChannels = get<2>(GetParam());
|
||||
|
||||
vector<Mat> mv;
|
||||
for( int i = 0; i < dstChannels; ++i )
|
||||
{
|
||||
mv.push_back( Mat(sz, CV_MAKETYPE(srcDepth, 1)) );
|
||||
randu(mv[i], 0, 255);
|
||||
}
|
||||
|
||||
Mat dst;
|
||||
TEST_CYCLE() merge( (vector<Mat> &)mv, dst );
|
||||
|
||||
SANITY_CHECK(dst, 1e-12);
|
||||
}
|
@@ -1,33 +1,33 @@
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
typedef std::tr1::tuple<Size, MatType, int> Size_Depth_Channels_t;
|
||||
typedef perf::TestBaseWithParam<Size_Depth_Channels_t> Size_Depth_Channels;
|
||||
|
||||
PERF_TEST_P( Size_Depth_Channels, split,
|
||||
testing::Combine
|
||||
(
|
||||
testing::Values(TYPICAL_MAT_SIZES),
|
||||
testing::Values(CV_8U, CV_16S, CV_32F, CV_64F),
|
||||
testing::Values(2, 3, 4)
|
||||
)
|
||||
)
|
||||
{
|
||||
Size sz = get<0>(GetParam());
|
||||
int depth = get<1>(GetParam());
|
||||
int channels = get<2>(GetParam());
|
||||
|
||||
Mat m(sz, CV_MAKETYPE(depth, channels));
|
||||
randu(m, 0, 255);
|
||||
|
||||
vector<Mat> mv;
|
||||
|
||||
TEST_CYCLE() split(m, (vector<Mat>&)mv);
|
||||
|
||||
SANITY_CHECK(mv, 1e-12);
|
||||
}
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
typedef std::tr1::tuple<Size, MatType, int> Size_Depth_Channels_t;
|
||||
typedef perf::TestBaseWithParam<Size_Depth_Channels_t> Size_Depth_Channels;
|
||||
|
||||
PERF_TEST_P( Size_Depth_Channels, split,
|
||||
testing::Combine
|
||||
(
|
||||
testing::Values(TYPICAL_MAT_SIZES),
|
||||
testing::Values(CV_8U, CV_16S, CV_32F, CV_64F),
|
||||
testing::Values(2, 3, 4)
|
||||
)
|
||||
)
|
||||
{
|
||||
Size sz = get<0>(GetParam());
|
||||
int depth = get<1>(GetParam());
|
||||
int channels = get<2>(GetParam());
|
||||
|
||||
Mat m(sz, CV_MAKETYPE(depth, channels));
|
||||
randu(m, 0, 255);
|
||||
|
||||
vector<Mat> mv;
|
||||
|
||||
TEST_CYCLE() split(m, (vector<Mat>&)mv);
|
||||
|
||||
SANITY_CHECK(mv, 1e-12);
|
||||
}
|
||||
|
@@ -1044,9 +1044,9 @@ static void binary_op(InputArray _src1, InputArray _src2, OutputArray _dst,
|
||||
|
||||
_dst.create(src1.dims, src1.size, src1.type());
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
|
||||
// if this is mask operation and dst has been reallocated,
|
||||
// we have to
|
||||
// we have to
|
||||
if( haveMask && reallocate )
|
||||
dst = Scalar::all(0);
|
||||
|
||||
@@ -1071,7 +1071,7 @@ static void binary_op(InputArray _src1, InputArray _src2, OutputArray _dst,
|
||||
|
||||
if( blocksize*c > INT_MAX )
|
||||
blocksize = INT_MAX/c;
|
||||
|
||||
|
||||
if( haveMask )
|
||||
{
|
||||
blocksize = std::min(blocksize, blocksize0);
|
||||
@@ -1352,10 +1352,10 @@ static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
|
||||
|
||||
_dst.create(src1.dims, src1.size, dtype);
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
|
||||
if( haveMask && reallocate )
|
||||
dst = Scalar::all(0);
|
||||
|
||||
|
||||
BinaryFunc func = tab[CV_MAT_DEPTH(wtype)];
|
||||
|
||||
if( !haveScalar )
|
||||
@@ -1585,7 +1585,7 @@ mul_( const T* src1, size_t step1, const T* src2, size_t step2,
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
{
|
||||
int i=0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for(; i <= size.width - 4; i += 4 )
|
||||
{
|
||||
T t0;
|
||||
@@ -1610,7 +1610,7 @@ mul_( const T* src1, size_t step1, const T* src2, size_t step2,
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
{
|
||||
int i = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for(; i <= size.width - 4; i += 4 )
|
||||
{
|
||||
T t0 = saturate_cast<T>(scale*(WT)src1[i]*src2[i]);
|
||||
@@ -1639,7 +1639,7 @@ div_( const T* src1, size_t step1, const T* src2, size_t step2,
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
{
|
||||
int i = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= size.width - 4; i += 4 )
|
||||
{
|
||||
if( src2[i] != 0 && src2[i+1] != 0 && src2[i+2] != 0 && src2[i+3] != 0 )
|
||||
@@ -1685,7 +1685,7 @@ recip_( const T*, size_t, const T* src2, size_t step2,
|
||||
for( ; size.height--; src2 += step2, dst += step )
|
||||
{
|
||||
int i = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= size.width - 4; i += 4 )
|
||||
{
|
||||
if( src2[i] != 0 && src2[i+1] != 0 && src2[i+2] != 0 && src2[i+3] != 0 )
|
||||
@@ -1710,7 +1710,7 @@ recip_( const T*, size_t, const T* src2, size_t step2,
|
||||
T z1 = src2[i+1] != 0 ? saturate_cast<T>(scale/src2[i+1]) : 0;
|
||||
T z2 = src2[i+2] != 0 ? saturate_cast<T>(scale/src2[i+2]) : 0;
|
||||
T z3 = src2[i+3] != 0 ? saturate_cast<T>(scale/src2[i+3]) : 0;
|
||||
|
||||
|
||||
dst[i] = z0; dst[i+1] = z1;
|
||||
dst[i+2] = z2; dst[i+3] = z3;
|
||||
}
|
||||
@@ -1757,7 +1757,7 @@ static void mul32f( const float* src1, size_t step1, const float* src2, size_t s
|
||||
{
|
||||
mul_(src1, step1, src2, step2, dst, step, sz, (float)*(const double*)scale);
|
||||
}
|
||||
|
||||
|
||||
static void mul64f( const double* src1, size_t step1, const double* src2, size_t step2,
|
||||
double* dst, size_t step, Size sz, void* scale)
|
||||
{
|
||||
@@ -1914,7 +1914,7 @@ addWeighted_( const T* src1, size_t step1, const T* src2, size_t step2,
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
{
|
||||
int x = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; x <= size.width - 4; x += 4 )
|
||||
{
|
||||
T t0 = saturate_cast<T>(src1[x]*alpha + src2[x]*beta + gamma);
|
||||
@@ -1972,7 +1972,7 @@ addWeighted8u( const uchar* src1, size_t step1,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; x <= size.width - 4; x += 4 )
|
||||
{
|
||||
float t0, t1;
|
||||
@@ -2077,7 +2077,7 @@ cmp_(const T* src1, size_t step1, const T* src2, size_t step2,
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
{
|
||||
int x = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; x <= size.width - 4; x += 4 )
|
||||
{
|
||||
int t0, t1;
|
||||
@@ -2091,7 +2091,7 @@ cmp_(const T* src1, size_t step1, const T* src2, size_t step2,
|
||||
#endif
|
||||
for( ; x < size.width; x++ )
|
||||
dst[x] = (uchar)(-(src1[x] > src2[x]) ^ m);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( code == CMP_EQ || code == CMP_NE )
|
||||
{
|
||||
@@ -2099,7 +2099,7 @@ cmp_(const T* src1, size_t step1, const T* src2, size_t step2,
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
{
|
||||
int x = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; x <= size.width - 4; x += 4 )
|
||||
{
|
||||
int t0, t1;
|
||||
@@ -2122,7 +2122,7 @@ static void cmp8u(const uchar* src1, size_t step1, const uchar* src2, size_t ste
|
||||
uchar* dst, size_t step, Size size, void* _cmpop)
|
||||
{
|
||||
//vz optimized cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
int code = *(int*)_cmpop;
|
||||
int code = *(int*)_cmpop;
|
||||
step1 /= sizeof(src1[0]);
|
||||
step2 /= sizeof(src2[0]);
|
||||
if( code == CMP_GE || code == CMP_LT )
|
||||
@@ -2138,47 +2138,47 @@ static void cmp8u(const uchar* src1, size_t step1, const uchar* src2, size_t ste
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
{
|
||||
int x =0;
|
||||
#if CV_SSE2
|
||||
if( USE_SSE2 ){
|
||||
#if CV_SSE2
|
||||
if( USE_SSE2 ){
|
||||
__m128i m128 = code == CMP_GT ? _mm_setzero_si128() : _mm_set1_epi8 (-1);
|
||||
__m128i c128 = _mm_set1_epi8 (-128);
|
||||
for( ; x <= size.width - 16; x += 16 )
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
// no simd for 8u comparison, that's why we need the trick
|
||||
r00 = _mm_sub_epi8(r00,c128);
|
||||
r10 = _mm_sub_epi8(r10,c128);
|
||||
for( ; x <= size.width - 16; x += 16 )
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
// no simd for 8u comparison, that's why we need the trick
|
||||
r00 = _mm_sub_epi8(r00,c128);
|
||||
r10 = _mm_sub_epi8(r10,c128);
|
||||
|
||||
r00 =_mm_xor_si128(_mm_cmpgt_epi8(r00, r10), m128);
|
||||
_mm_storeu_si128((__m128i*)(dst + x),r00);
|
||||
|
||||
}
|
||||
}
|
||||
r00 =_mm_xor_si128(_mm_cmpgt_epi8(r00, r10), m128);
|
||||
_mm_storeu_si128((__m128i*)(dst + x),r00);
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for( ; x < size.width; x++ ){
|
||||
for( ; x < size.width; x++ ){
|
||||
dst[x] = (uchar)(-(src1[x] > src2[x]) ^ m);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( code == CMP_EQ || code == CMP_NE )
|
||||
{
|
||||
int m = code == CMP_EQ ? 0 : 255;
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
{
|
||||
int x = 0;
|
||||
#if CV_SSE2
|
||||
if( USE_SSE2 ){
|
||||
#if CV_SSE2
|
||||
if( USE_SSE2 ){
|
||||
__m128i m128 = code == CMP_EQ ? _mm_setzero_si128() : _mm_set1_epi8 (-1);
|
||||
for( ; x <= size.width - 16; x += 16 )
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
r00 = _mm_xor_si128 ( _mm_cmpeq_epi8 (r00, r10), m128);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), r00);
|
||||
}
|
||||
}
|
||||
for( ; x <= size.width - 16; x += 16 )
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
r00 = _mm_xor_si128 ( _mm_cmpeq_epi8 (r00, r10), m128);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), r00);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
for( ; x < size.width; x++ )
|
||||
dst[x] = (uchar)(-(src1[x] == src2[x]) ^ m);
|
||||
@@ -2203,7 +2203,7 @@ static void cmp16s(const short* src1, size_t step1, const short* src2, size_t st
|
||||
{
|
||||
//vz optimized cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
|
||||
int code = *(int*)_cmpop;
|
||||
int code = *(int*)_cmpop;
|
||||
step1 /= sizeof(src1[0]);
|
||||
step2 /= sizeof(src2[0]);
|
||||
if( code == CMP_GE || code == CMP_LT )
|
||||
@@ -2219,69 +2219,69 @@ static void cmp16s(const short* src1, size_t step1, const short* src2, size_t st
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
{
|
||||
int x =0;
|
||||
#if CV_SSE2
|
||||
if( USE_SSE2){//
|
||||
#if CV_SSE2
|
||||
if( USE_SSE2){//
|
||||
__m128i m128 = code == CMP_GT ? _mm_setzero_si128() : _mm_set1_epi16 (-1);
|
||||
for( ; x <= size.width - 16; x += 16 )
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
r00 = _mm_xor_si128 ( _mm_cmpgt_epi16 (r00, r10), m128);
|
||||
__m128i r01 = _mm_loadu_si128((const __m128i*)(src1 + x + 8));
|
||||
__m128i r11 = _mm_loadu_si128((const __m128i*)(src2 + x + 8));
|
||||
r01 = _mm_xor_si128 ( _mm_cmpgt_epi16 (r01, r11), m128);
|
||||
r11 = _mm_packs_epi16(r00, r01);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), r11);
|
||||
}
|
||||
if( x <= size.width-8)
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
r00 = _mm_xor_si128 ( _mm_cmpgt_epi16 (r00, r10), m128);
|
||||
r10 = _mm_packs_epi16(r00, r00);
|
||||
_mm_storel_epi64((__m128i*)(dst + x), r10);
|
||||
for( ; x <= size.width - 16; x += 16 )
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
r00 = _mm_xor_si128 ( _mm_cmpgt_epi16 (r00, r10), m128);
|
||||
__m128i r01 = _mm_loadu_si128((const __m128i*)(src1 + x + 8));
|
||||
__m128i r11 = _mm_loadu_si128((const __m128i*)(src2 + x + 8));
|
||||
r01 = _mm_xor_si128 ( _mm_cmpgt_epi16 (r01, r11), m128);
|
||||
r11 = _mm_packs_epi16(r00, r01);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), r11);
|
||||
}
|
||||
if( x <= size.width-8)
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
r00 = _mm_xor_si128 ( _mm_cmpgt_epi16 (r00, r10), m128);
|
||||
r10 = _mm_packs_epi16(r00, r00);
|
||||
_mm_storel_epi64((__m128i*)(dst + x), r10);
|
||||
|
||||
x += 8;
|
||||
}
|
||||
}
|
||||
x += 8;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for( ; x < size.width; x++ ){
|
||||
for( ; x < size.width; x++ ){
|
||||
dst[x] = (uchar)(-(src1[x] > src2[x]) ^ m);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( code == CMP_EQ || code == CMP_NE )
|
||||
{
|
||||
int m = code == CMP_EQ ? 0 : 255;
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
for( ; size.height--; src1 += step1, src2 += step2, dst += step )
|
||||
{
|
||||
int x = 0;
|
||||
#if CV_SSE2
|
||||
if( USE_SSE2 ){
|
||||
#if CV_SSE2
|
||||
if( USE_SSE2 ){
|
||||
__m128i m128 = code == CMP_EQ ? _mm_setzero_si128() : _mm_set1_epi16 (-1);
|
||||
for( ; x <= size.width - 16; x += 16 )
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
r00 = _mm_xor_si128 ( _mm_cmpeq_epi16 (r00, r10), m128);
|
||||
__m128i r01 = _mm_loadu_si128((const __m128i*)(src1 + x + 8));
|
||||
__m128i r11 = _mm_loadu_si128((const __m128i*)(src2 + x + 8));
|
||||
r01 = _mm_xor_si128 ( _mm_cmpeq_epi16 (r01, r11), m128);
|
||||
r11 = _mm_packs_epi16(r00, r01);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), r11);
|
||||
}
|
||||
if( x <= size.width - 8)
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
r00 = _mm_xor_si128 ( _mm_cmpeq_epi16 (r00, r10), m128);
|
||||
r10 = _mm_packs_epi16(r00, r00);
|
||||
_mm_storel_epi64((__m128i*)(dst + x), r10);
|
||||
for( ; x <= size.width - 16; x += 16 )
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
r00 = _mm_xor_si128 ( _mm_cmpeq_epi16 (r00, r10), m128);
|
||||
__m128i r01 = _mm_loadu_si128((const __m128i*)(src1 + x + 8));
|
||||
__m128i r11 = _mm_loadu_si128((const __m128i*)(src2 + x + 8));
|
||||
r01 = _mm_xor_si128 ( _mm_cmpeq_epi16 (r01, r11), m128);
|
||||
r11 = _mm_packs_epi16(r00, r01);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), r11);
|
||||
}
|
||||
if( x <= size.width - 8)
|
||||
{
|
||||
__m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x));
|
||||
__m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x));
|
||||
r00 = _mm_xor_si128 ( _mm_cmpeq_epi16 (r00, r10), m128);
|
||||
r10 = _mm_packs_epi16(r00, r00);
|
||||
_mm_storel_epi64((__m128i*)(dst + x), r10);
|
||||
|
||||
x += 8;
|
||||
}
|
||||
}
|
||||
x += 8;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
for( ; x < size.width; x++ )
|
||||
dst[x] = (uchar)(-(src1[x] == src2[x]) ^ m);
|
||||
@@ -2368,13 +2368,13 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op)
|
||||
haveScalar = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int cn = src1.channels(), depth1 = src1.depth(), depth2 = src2.depth();
|
||||
|
||||
_dst.create(src1.dims, src1.size, CV_8UC(cn));
|
||||
src1 = src1.reshape(1); src2 = src2.reshape(1);
|
||||
Mat dst = _dst.getMat().reshape(1);
|
||||
|
||||
|
||||
size_t esz = src1.elemSize();
|
||||
size_t blocksize0 = (size_t)(BLOCK_SIZE + esz-1)/esz;
|
||||
BinaryFunc func = cmpTab[depth1];
|
||||
@@ -2467,7 +2467,7 @@ inRange_(const T* src1, size_t step1, const T* src2, size_t step2,
|
||||
for( ; size.height--; src1 += step1, src2 += step2, src3 += step3, dst += step )
|
||||
{
|
||||
int x = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; x <= size.width - 4; x += 4 )
|
||||
{
|
||||
int t0, t1;
|
||||
@@ -2661,7 +2661,7 @@ void cv::inRange(InputArray _src, InputArray _lowerb,
|
||||
ptrs[idx] += delta;
|
||||
}
|
||||
func( ptrs[0], 0, lptr, 0, uptr, 0, cn == 1 ? ptrs[1] : mbuf, 0, Size(bsz*cn, 1));
|
||||
if( cn > 1 )
|
||||
if( cn > 1 )
|
||||
inRangeReduce(mbuf, ptrs[1], bsz, cn);
|
||||
ptrs[0] += delta;
|
||||
ptrs[1] += bsz;
|
||||
|
@@ -69,7 +69,7 @@ cvSetIPLAllocators( Cv_iplCreateImageHeader createHeader,
|
||||
{
|
||||
int count = (createHeader != 0) + (allocateData != 0) + (deallocate != 0) +
|
||||
(createROI != 0) + (cloneImage != 0);
|
||||
|
||||
|
||||
if( count != 0 && count != 5 )
|
||||
CV_Error( CV_StsBadArg, "Either all the pointers should be null or "
|
||||
"they all should be non-null" );
|
||||
@@ -144,7 +144,7 @@ cvInitMatHeader( CvMat* arr, int rows, int cols,
|
||||
|
||||
if( rows < 0 || cols <= 0 )
|
||||
CV_Error( CV_StsBadSize, "Non-positive cols or rows" );
|
||||
|
||||
|
||||
type = CV_MAT_TYPE( type );
|
||||
arr->type = type | CV_MAT_MAGIC_VAL;
|
||||
arr->rows = rows;
|
||||
@@ -185,7 +185,7 @@ cvReleaseMat( CvMat** array )
|
||||
if( *array )
|
||||
{
|
||||
CvMat* arr = *array;
|
||||
|
||||
|
||||
if( !CV_IS_MAT_HDR_Z(arr) && !CV_IS_MATND_HDR(arr) )
|
||||
CV_Error( CV_StsBadFlag, "" );
|
||||
|
||||
@@ -280,7 +280,7 @@ cvCreateMatNDHeader( int dims, const int* sizes, int type )
|
||||
"non-positive or too large number of dimensions" );
|
||||
|
||||
CvMatND* arr = (CvMatND*)cvAlloc( sizeof(*arr) );
|
||||
|
||||
|
||||
cvInitMatNDHeader( arr, dims, sizes, type, 0 );
|
||||
arr->hdr_refcount = 1;
|
||||
return arr;
|
||||
@@ -331,19 +331,19 @@ cvGetMatND( const CvArr* arr, CvMatND* matnd, int* coi )
|
||||
{
|
||||
if( !((CvMatND*)arr)->data.ptr )
|
||||
CV_Error( CV_StsNullPtr, "The matrix has NULL data pointer" );
|
||||
|
||||
|
||||
result = (CvMatND*)arr;
|
||||
}
|
||||
else
|
||||
{
|
||||
CvMat stub, *mat = (CvMat*)arr;
|
||||
|
||||
|
||||
if( CV_IS_IMAGE_HDR( mat ))
|
||||
mat = cvGetMat( mat, &stub, coi );
|
||||
|
||||
if( !CV_IS_MAT_HDR( mat ))
|
||||
CV_Error( CV_StsBadArg, "Unrecognized or unsupported array type" );
|
||||
|
||||
|
||||
if( !mat->data.ptr )
|
||||
CV_Error( CV_StsNullPtr, "Input array has NULL data pointer" );
|
||||
|
||||
@@ -370,7 +370,7 @@ that needs to have the same size, but 8uC1 or 8sC1 type).
|
||||
Returns number of dimensions to iterate through:
|
||||
0 means that all arrays are continuous,
|
||||
1 means that all arrays are vectors of continuous arrays etc.
|
||||
and the size of largest common continuous part of the arrays
|
||||
and the size of largest common continuous part of the arrays
|
||||
*/
|
||||
CV_IMPL int
|
||||
cvInitNArrayIterator( int count, CvArr** arrs,
|
||||
@@ -395,7 +395,7 @@ cvInitNArrayIterator( int count, CvArr** arrs,
|
||||
{
|
||||
const CvArr* arr = i < count ? arrs[i] : mask;
|
||||
CvMatND* hdr;
|
||||
|
||||
|
||||
if( !arr )
|
||||
{
|
||||
if( i < count )
|
||||
@@ -420,7 +420,7 @@ cvInitNArrayIterator( int count, CvArr** arrs,
|
||||
if( hdr->dims != hdr0->dims )
|
||||
CV_Error( CV_StsUnmatchedSizes,
|
||||
"Number of dimensions is the same for all arrays" );
|
||||
|
||||
|
||||
if( i < count )
|
||||
{
|
||||
switch( flags & (CV_NO_DEPTH_CHECK|CV_NO_CN_CHECK))
|
||||
@@ -566,7 +566,7 @@ cvCreateSparseMat( int dims, const int* sizes, int type )
|
||||
|
||||
arr->hashsize = CV_SPARSE_HASH_SIZE0;
|
||||
size = arr->hashsize*sizeof(arr->hashtable[0]);
|
||||
|
||||
|
||||
arr->hashtable = (void**)cvAlloc( size );
|
||||
memset( arr->hashtable, 0, size );
|
||||
|
||||
@@ -584,7 +584,7 @@ cvReleaseSparseMat( CvSparseMat** array )
|
||||
if( *array )
|
||||
{
|
||||
CvSparseMat* arr = *array;
|
||||
|
||||
|
||||
if( !CV_IS_SPARSE_MAT_HDR(arr) )
|
||||
CV_Error( CV_StsBadFlag, "" );
|
||||
|
||||
@@ -606,7 +606,7 @@ cvCloneSparseMat( const CvSparseMat* src )
|
||||
CV_Error( CV_StsBadArg, "Invalid sparse array header" );
|
||||
|
||||
CvSparseMat* dst = cvCreateSparseMat( src->dims, src->size, src->type );
|
||||
cvCopy( src, dst );
|
||||
cvCopy( src, dst );
|
||||
return dst;
|
||||
}
|
||||
|
||||
@@ -694,7 +694,7 @@ icvGetNodePtr( CvSparseMat* mat, const int* idx, int* _type,
|
||||
void** newtable;
|
||||
int newsize = MAX( mat->hashsize*2, CV_SPARSE_HASH_SIZE0);
|
||||
int newrawsize = newsize*sizeof(newtable[0]);
|
||||
|
||||
|
||||
CvSparseMatIterator iterator;
|
||||
assert( (newsize & (newsize - 1)) == 0 );
|
||||
|
||||
@@ -802,7 +802,7 @@ cvCreateData( CvArr* arr )
|
||||
|
||||
if( mat->rows == 0 || mat->cols == 0 )
|
||||
return;
|
||||
|
||||
|
||||
if( mat->data.ptr != 0 )
|
||||
CV_Error( CV_StsError, "Data is already allocated" );
|
||||
|
||||
@@ -826,7 +826,7 @@ cvCreateData( CvArr* arr )
|
||||
|
||||
if( !CvIPL.allocateData )
|
||||
{
|
||||
img->imageData = img->imageDataOrigin =
|
||||
img->imageData = img->imageDataOrigin =
|
||||
(char*)cvAlloc( (size_t)img->imageSize );
|
||||
}
|
||||
else
|
||||
@@ -851,7 +851,7 @@ cvCreateData( CvArr* arr )
|
||||
CvMatND* mat = (CvMatND*)arr;
|
||||
int i;
|
||||
size_t total_size = CV_ELEM_SIZE(mat->type);
|
||||
|
||||
|
||||
if( mat->dim[0].size == 0 )
|
||||
return;
|
||||
|
||||
@@ -873,7 +873,7 @@ cvCreateData( CvArr* arr )
|
||||
total_size = size;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mat->refcount = (int*)cvAlloc( total_size +
|
||||
sizeof(int) + CV_MALLOC_ALIGN );
|
||||
mat->data.ptr = (uchar*)cvAlignPtr( mat->refcount + 1, CV_MALLOC_ALIGN );
|
||||
@@ -896,7 +896,7 @@ cvSetData( CvArr* arr, void* data, int step )
|
||||
if( CV_IS_MAT_HDR( arr ))
|
||||
{
|
||||
CvMat* mat = (CvMat*)arr;
|
||||
|
||||
|
||||
int type = CV_MAT_TYPE(mat->type);
|
||||
pix_size = CV_ELEM_SIZE(type);
|
||||
min_step = mat->cols*pix_size;
|
||||
@@ -918,7 +918,7 @@ cvSetData( CvArr* arr, void* data, int step )
|
||||
else if( CV_IS_IMAGE_HDR( arr ))
|
||||
{
|
||||
IplImage* img = (IplImage*)arr;
|
||||
|
||||
|
||||
pix_size = ((img->depth & 255) >> 3)*img->nChannels;
|
||||
min_step = img->width*pix_size;
|
||||
|
||||
@@ -947,7 +947,7 @@ cvSetData( CvArr* arr, void* data, int step )
|
||||
CvMatND* mat = (CvMatND*)arr;
|
||||
int i;
|
||||
int64 cur_step;
|
||||
|
||||
|
||||
if( step != CV_AUTOSTEP )
|
||||
CV_Error( CV_BadStep,
|
||||
"For multidimensional array only CV_AUTOSTEP is allowed here" );
|
||||
@@ -1097,7 +1097,7 @@ cvGetDims( const CvArr* arr, int* sizes )
|
||||
if( CV_IS_MAT_HDR( arr ))
|
||||
{
|
||||
CvMat* mat = (CvMat*)arr;
|
||||
|
||||
|
||||
dims = 2;
|
||||
if( sizes )
|
||||
{
|
||||
@@ -1120,7 +1120,7 @@ cvGetDims( const CvArr* arr, int* sizes )
|
||||
{
|
||||
CvMatND* mat = (CvMatND*)arr;
|
||||
dims = mat->dims;
|
||||
|
||||
|
||||
if( sizes )
|
||||
{
|
||||
int i;
|
||||
@@ -1132,7 +1132,7 @@ cvGetDims( const CvArr* arr, int* sizes )
|
||||
{
|
||||
CvSparseMat* mat = (CvSparseMat*)arr;
|
||||
dims = mat->dims;
|
||||
|
||||
|
||||
if( sizes )
|
||||
memcpy( sizes, mat->size, dims*sizeof(sizes[0]));
|
||||
}
|
||||
@@ -1184,7 +1184,7 @@ cvGetDimSize( const CvArr* arr, int index )
|
||||
else if( CV_IS_MATND_HDR( arr ))
|
||||
{
|
||||
CvMatND* mat = (CvMatND*)arr;
|
||||
|
||||
|
||||
if( (unsigned)index >= (unsigned)mat->dims )
|
||||
CV_Error( CV_StsOutOfRange, "bad dimension index" );
|
||||
|
||||
@@ -1193,7 +1193,7 @@ cvGetDimSize( const CvArr* arr, int index )
|
||||
else if( CV_IS_SPARSE_MAT_HDR( arr ))
|
||||
{
|
||||
CvSparseMat* mat = (CvSparseMat*)arr;
|
||||
|
||||
|
||||
if( (unsigned)index >= (unsigned)mat->dims )
|
||||
CV_Error( CV_StsOutOfRange, "bad dimension index" );
|
||||
|
||||
@@ -1350,7 +1350,7 @@ cvGetCols( const CvArr* arr, CvMat* submat, int start_col, int end_col )
|
||||
|
||||
if( !submat )
|
||||
CV_Error( CV_StsNullPtr, "" );
|
||||
|
||||
|
||||
cols = mat->cols;
|
||||
if( (unsigned)start_col >= (unsigned)cols ||
|
||||
(unsigned)end_col > (unsigned)cols )
|
||||
@@ -1385,7 +1385,7 @@ cvGetDiag( const CvArr* arr, CvMat* submat, int diag )
|
||||
{
|
||||
CvMat* res = 0;
|
||||
CvMat stub, *mat = (CvMat*)arr;
|
||||
int len, pix_size;
|
||||
int len, pix_size;
|
||||
|
||||
if( !CV_IS_MAT( mat ))
|
||||
mat = cvGetMat( mat, &stub );
|
||||
@@ -1407,7 +1407,7 @@ cvGetDiag( const CvArr* arr, CvMat* submat, int diag )
|
||||
if( diag >= 0 )
|
||||
{
|
||||
len = mat->cols - diag;
|
||||
|
||||
|
||||
if( len <= 0 )
|
||||
CV_Error( CV_StsOutOfRange, "" );
|
||||
|
||||
@@ -1417,7 +1417,7 @@ cvGetDiag( const CvArr* arr, CvMat* submat, int diag )
|
||||
else
|
||||
{
|
||||
len = mat->rows + diag;
|
||||
|
||||
|
||||
if( len <= 0 )
|
||||
CV_Error( CV_StsOutOfRange, "" );
|
||||
|
||||
@@ -1526,7 +1526,7 @@ cvRawDataToScalar( const void* data, int flags, CvScalar* scalar )
|
||||
int cn = CV_MAT_CN( flags );
|
||||
|
||||
assert( scalar && data );
|
||||
|
||||
|
||||
if( (unsigned)(cn - 1) >= 4 )
|
||||
CV_Error( CV_StsOutOfRange, "The number of channels must be 1, 2, 3 or 4" );
|
||||
|
||||
@@ -1646,7 +1646,7 @@ cvPtr1D( const CvArr* arr, int idx, int* _type )
|
||||
|
||||
if( _type )
|
||||
*_type = type;
|
||||
|
||||
|
||||
// the first part is mul-free sufficient check
|
||||
// that the index is within the matrix
|
||||
if( (unsigned)idx >= (unsigned)(mat->rows + mat->cols - 1) &&
|
||||
@@ -1720,7 +1720,7 @@ cvPtr1D( const CvArr* arr, int idx, int* _type )
|
||||
int i, n = m->dims;
|
||||
CV_DbgAssert( n <= CV_MAX_DIM_HEAP );
|
||||
int _idx[CV_MAX_DIM_HEAP];
|
||||
|
||||
|
||||
for( i = n - 1; i >= 0; i-- )
|
||||
{
|
||||
int t = idx / m->size[i];
|
||||
@@ -1811,7 +1811,7 @@ cvPtr2D( const CvArr* arr, int y, int x, int* _type )
|
||||
{
|
||||
CvMatND* mat = (CvMatND*)arr;
|
||||
|
||||
if( mat->dims != 2 ||
|
||||
if( mat->dims != 2 ||
|
||||
(unsigned)y >= (unsigned)(mat->dim[0].size) ||
|
||||
(unsigned)x >= (unsigned)(mat->dim[1].size) )
|
||||
CV_Error( CV_StsOutOfRange, "index is out of range" );
|
||||
@@ -1843,7 +1843,7 @@ cvPtr3D( const CvArr* arr, int z, int y, int x, int* _type )
|
||||
{
|
||||
CvMatND* mat = (CvMatND*)arr;
|
||||
|
||||
if( mat->dims != 3 ||
|
||||
if( mat->dims != 3 ||
|
||||
(unsigned)z >= (unsigned)(mat->dim[0].size) ||
|
||||
(unsigned)y >= (unsigned)(mat->dim[1].size) ||
|
||||
(unsigned)x >= (unsigned)(mat->dim[2].size) )
|
||||
@@ -1879,7 +1879,7 @@ cvPtrND( const CvArr* arr, const int* idx, int* _type,
|
||||
CV_Error( CV_StsNullPtr, "NULL pointer to indices" );
|
||||
|
||||
if( CV_IS_SPARSE_MAT( arr ))
|
||||
ptr = icvGetNodePtr( (CvSparseMat*)arr, idx,
|
||||
ptr = icvGetNodePtr( (CvSparseMat*)arr, idx,
|
||||
_type, create_node, precalc_hashval );
|
||||
else if( CV_IS_MATND( arr ))
|
||||
{
|
||||
@@ -1913,7 +1913,7 @@ cvGet1D( const CvArr* arr, int idx )
|
||||
CvScalar scalar = {{0,0,0,0}};
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( CV_IS_MAT( arr ) && CV_IS_MAT_CONT( ((CvMat*)arr)->type ))
|
||||
{
|
||||
CvMat* mat = (CvMat*)arr;
|
||||
@@ -1990,7 +1990,7 @@ cvGet3D( const CvArr* arr, int z, int y, int x )
|
||||
int idx[] = { z, y, x };
|
||||
ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, 0, 0 );
|
||||
}
|
||||
|
||||
|
||||
if( ptr )
|
||||
cvRawDataToScalar( ptr, type, &scalar );
|
||||
return scalar;
|
||||
@@ -2063,7 +2063,7 @@ cvGetReal2D( const CvArr* arr, int y, int x )
|
||||
double value = 0;
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( CV_IS_MAT( arr ))
|
||||
{
|
||||
CvMat* mat = (CvMat*)arr;
|
||||
@@ -2110,7 +2110,7 @@ cvGetReal3D( const CvArr* arr, int z, int y, int x )
|
||||
int idx[] = { z, y, x };
|
||||
ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, 0, 0 );
|
||||
}
|
||||
|
||||
|
||||
if( ptr )
|
||||
{
|
||||
if( CV_MAT_CN( type ) > 1 )
|
||||
@@ -2130,7 +2130,7 @@ cvGetRealND( const CvArr* arr, const int* idx )
|
||||
double value = 0;
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( !CV_IS_SPARSE_MAT( arr ))
|
||||
ptr = cvPtrND( arr, idx, &type );
|
||||
else
|
||||
@@ -2154,7 +2154,7 @@ cvSet1D( CvArr* arr, int idx, CvScalar scalar )
|
||||
{
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( CV_IS_MAT( arr ) && CV_IS_MAT_CONT( ((CvMat*)arr)->type ))
|
||||
{
|
||||
CvMat* mat = (CvMat*)arr;
|
||||
@@ -2185,7 +2185,7 @@ cvSet2D( CvArr* arr, int y, int x, CvScalar scalar )
|
||||
{
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( CV_IS_MAT( arr ))
|
||||
{
|
||||
CvMat* mat = (CvMat*)arr;
|
||||
@@ -2214,7 +2214,7 @@ cvSet3D( CvArr* arr, int z, int y, int x, CvScalar scalar )
|
||||
{
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( !CV_IS_SPARSE_MAT( arr ))
|
||||
ptr = cvPtr3D( arr, z, y, x, &type );
|
||||
else
|
||||
@@ -2232,7 +2232,7 @@ cvSetND( CvArr* arr, const int* idx, CvScalar scalar )
|
||||
{
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( !CV_IS_SPARSE_MAT( arr ))
|
||||
ptr = cvPtrND( arr, idx, &type );
|
||||
else
|
||||
@@ -2246,7 +2246,7 @@ cvSetReal1D( CvArr* arr, int idx, double value )
|
||||
{
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( CV_IS_MAT( arr ) && CV_IS_MAT_CONT( ((CvMat*)arr)->type ))
|
||||
{
|
||||
CvMat* mat = (CvMat*)arr;
|
||||
@@ -2280,7 +2280,7 @@ cvSetReal2D( CvArr* arr, int y, int x, double value )
|
||||
{
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( CV_IS_MAT( arr ))
|
||||
{
|
||||
CvMat* mat = (CvMat*)arr;
|
||||
@@ -2314,7 +2314,7 @@ cvSetReal3D( CvArr* arr, int z, int y, int x, double value )
|
||||
{
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( !CV_IS_SPARSE_MAT( arr ))
|
||||
ptr = cvPtr3D( arr, z, y, x, &type );
|
||||
else
|
||||
@@ -2335,7 +2335,7 @@ cvSetRealND( CvArr* arr, const int* idx, double value )
|
||||
{
|
||||
int type = 0;
|
||||
uchar* ptr;
|
||||
|
||||
|
||||
if( !CV_IS_SPARSE_MAT( arr ))
|
||||
ptr = cvPtrND( arr, idx, &type );
|
||||
else
|
||||
@@ -2385,7 +2385,7 @@ cvGetMat( const CvArr* array, CvMat* mat,
|
||||
{
|
||||
if( !src->data.ptr )
|
||||
CV_Error( CV_StsNullPtr, "The matrix has NULL data pointer" );
|
||||
|
||||
|
||||
result = (CvMat*)src;
|
||||
}
|
||||
else if( CV_IS_IMAGE_HDR(src) )
|
||||
@@ -2453,7 +2453,7 @@ cvGetMat( const CvArr* array, CvMat* mat,
|
||||
CvMatND* matnd = (CvMatND*)src;
|
||||
int i;
|
||||
int size1 = matnd->dim[0].size, size2 = 1;
|
||||
|
||||
|
||||
if( !src->data.ptr )
|
||||
CV_Error( CV_StsNullPtr, "Input array has NULL data pointer" );
|
||||
|
||||
@@ -2537,7 +2537,7 @@ cvReshapeMatND( const CvArr* arr,
|
||||
refcount = mat->refcount;
|
||||
hdr_refcount = mat->hdr_refcount;
|
||||
}
|
||||
|
||||
|
||||
if( !CV_IS_MAT( mat ))
|
||||
mat = cvGetMat( mat, &header, &coi, 1 );
|
||||
|
||||
@@ -2586,7 +2586,7 @@ cvReshapeMatND( const CvArr* arr,
|
||||
header.step &= new_rows > 1 ? -1 : 0;
|
||||
header.refcount = refcount;
|
||||
header.hdr_refcount = hdr_refcount;
|
||||
|
||||
|
||||
if( sizeof_header == sizeof(CvMat) )
|
||||
*(CvMat*)_header = header;
|
||||
else
|
||||
@@ -2603,7 +2603,7 @@ cvReshapeMatND( const CvArr* arr,
|
||||
|
||||
if( sizeof_header != sizeof(CvMatND))
|
||||
CV_Error( CV_StsBadSize, "The output header should be CvMatND" );
|
||||
|
||||
|
||||
if( !new_sizes )
|
||||
{
|
||||
if( !CV_IS_MATND( arr ))
|
||||
@@ -2636,12 +2636,12 @@ cvReshapeMatND( const CvArr* arr,
|
||||
CvMatND* mat = (CvMatND*)arr;
|
||||
int i, size1, size2;
|
||||
int step;
|
||||
|
||||
|
||||
if( new_cn != 0 )
|
||||
CV_Error( CV_StsBadArg,
|
||||
"Simultaneous change of shape and number of channels is not supported. "
|
||||
"Do it by 2 separate calls" );
|
||||
|
||||
|
||||
if( !CV_IS_MATND( mat ))
|
||||
{
|
||||
cvGetMatND( mat, &stub, &coi );
|
||||
@@ -2786,7 +2786,7 @@ cvGetImage( const CvArr* array, IplImage* img )
|
||||
if( !CV_IS_IMAGE_HDR(src) )
|
||||
{
|
||||
const CvMat* mat = (const CvMat*)src;
|
||||
|
||||
|
||||
if( !CV_IS_MAT_HDR(mat))
|
||||
CV_Error( CV_StsBadFlag, "" );
|
||||
|
||||
@@ -2962,7 +2962,7 @@ cvReleaseImageHeader( IplImage** image )
|
||||
{
|
||||
IplImage* img = *image;
|
||||
*image = 0;
|
||||
|
||||
|
||||
if( !CvIPL.deallocate )
|
||||
{
|
||||
cvFree( &img->roi );
|
||||
@@ -2986,7 +2986,7 @@ cvReleaseImage( IplImage ** image )
|
||||
{
|
||||
IplImage* img = *image;
|
||||
*image = 0;
|
||||
|
||||
|
||||
cvReleaseData( img );
|
||||
cvReleaseImageHeader( &img );
|
||||
}
|
||||
@@ -3004,15 +3004,15 @@ cvSetImageROI( IplImage* image, CvRect rect )
|
||||
rect.x < image->width && rect.y < image->height &&
|
||||
rect.x + rect.width >= (int)(rect.width > 0) &&
|
||||
rect.y + rect.height >= (int)(rect.height > 0) );
|
||||
|
||||
|
||||
rect.width += rect.x;
|
||||
rect.height += rect.y;
|
||||
|
||||
|
||||
rect.x = std::max(rect.x, 0);
|
||||
rect.y = std::max(rect.y, 0);
|
||||
rect.width = std::min(rect.width, image->width);
|
||||
rect.height = std::min(rect.height, image->height);
|
||||
|
||||
|
||||
rect.width -= rect.x;
|
||||
rect.height -= rect.y;
|
||||
|
||||
@@ -3061,7 +3061,7 @@ cvGetImageROI( const IplImage* img )
|
||||
img->roi->width, img->roi->height );
|
||||
else
|
||||
rect = cvRect( 0, 0, img->width, img->height );
|
||||
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
@@ -3160,7 +3160,7 @@ cvCheckTermCriteria( CvTermCriteria criteria, double default_eps,
|
||||
"Iterations flag is set and maximum number of iterations is <= 0" );
|
||||
crit.max_iter = criteria.max_iter;
|
||||
}
|
||||
|
||||
|
||||
if( (criteria.type & CV_TERMCRIT_EPS) != 0 )
|
||||
{
|
||||
if( criteria.epsilon < 0 )
|
||||
@@ -3182,9 +3182,9 @@ cvCheckTermCriteria( CvTermCriteria criteria, double default_eps,
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
|
||||
template<> void Ptr<CvMat>::delete_obj()
|
||||
{ cvReleaseMat(&obj); }
|
||||
{ cvReleaseMat(&obj); }
|
||||
|
||||
template<> void Ptr<IplImage>::delete_obj()
|
||||
{ cvReleaseImage(&obj); }
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -669,7 +669,7 @@ cvtScale_<short, int, float>( const short* src, size_t sstep,
|
||||
{
|
||||
int x = 0;
|
||||
|
||||
#if CV_SSE2
|
||||
#if CV_SSE2
|
||||
if(USE_SSE2)//~5X
|
||||
{
|
||||
__m128 scale128 = _mm_set1_ps (scale);
|
||||
@@ -684,27 +684,27 @@ cvtScale_<short, int, float>( const short* src, size_t sstep,
|
||||
rf1 = _mm_add_ps(_mm_mul_ps(rf1, scale128), shift128);
|
||||
r0 = _mm_cvtps_epi32(rf0);
|
||||
r1 = _mm_cvtps_epi32(rf1);
|
||||
|
||||
|
||||
_mm_storeu_si128((__m128i*)(dst + x), r0);
|
||||
_mm_storeu_si128((__m128i*)(dst + x + 4), r1);
|
||||
_mm_storeu_si128((__m128i*)(dst + x + 4), r1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//We will wait Haswell
|
||||
/*
|
||||
//We will wait Haswell
|
||||
/*
|
||||
#if CV_AVX
|
||||
if(USE_AVX)//2X - bad variant
|
||||
{
|
||||
////TODO:AVX implementation (optimization?) required
|
||||
////TODO:AVX implementation (optimization?) required
|
||||
__m256 scale256 = _mm256_set1_ps (scale);
|
||||
__m256 shift256 = _mm256_set1_ps (shift);
|
||||
__m256 shift256 = _mm256_set1_ps (shift);
|
||||
for(; x <= size.width - 8; x += 8 )
|
||||
{
|
||||
__m256i buf = _mm256_set_epi32((int)(*(src+x+7)),(int)(*(src+x+6)),(int)(*(src+x+5)),(int)(*(src+x+4)),(int)(*(src+x+3)),(int)(*(src+x+2)),(int)(*(src+x+1)),(int)(*(src+x)));
|
||||
__m256 r0 = _mm256_add_ps( _mm256_mul_ps(_mm256_cvtepi32_ps (buf), scale256), shift256);
|
||||
__m256i res = _mm256_cvtps_epi32(r0);
|
||||
_mm256_storeu_si256 ((__m256i*)(dst+x), res);
|
||||
__m256i buf = _mm256_set_epi32((int)(*(src+x+7)),(int)(*(src+x+6)),(int)(*(src+x+5)),(int)(*(src+x+4)),(int)(*(src+x+3)),(int)(*(src+x+2)),(int)(*(src+x+1)),(int)(*(src+x)));
|
||||
__m256 r0 = _mm256_add_ps( _mm256_mul_ps(_mm256_cvtepi32_ps (buf), scale256), shift256);
|
||||
__m256i res = _mm256_cvtps_epi32(r0);
|
||||
_mm256_storeu_si256 ((__m256i*)(dst+x), res);
|
||||
}
|
||||
}
|
||||
#endif*/
|
||||
|
@@ -87,20 +87,20 @@ copyMask_<uchar>(const uchar* _src, size_t sstep, const uchar* mask, size_t mste
|
||||
uchar* dst = (uchar*)_dst;
|
||||
int x = 0;
|
||||
#if CV_SSE4_2
|
||||
if(USE_SSE4_2)//
|
||||
{
|
||||
__m128i zero = _mm_setzero_si128 ();
|
||||
|
||||
for( ; x <= size.width - 16; x += 16 )
|
||||
{
|
||||
const __m128i rSrc = _mm_lddqu_si128((const __m128i*)(src+x));
|
||||
__m128i _mask = _mm_lddqu_si128((const __m128i*)(mask+x));
|
||||
__m128i rDst = _mm_lddqu_si128((__m128i*)(dst+x));
|
||||
__m128i _negMask = _mm_cmpeq_epi8(_mask, zero);
|
||||
rDst = _mm_blendv_epi8(rSrc, rDst, _negMask);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), rDst);
|
||||
}
|
||||
}
|
||||
if(USE_SSE4_2)//
|
||||
{
|
||||
__m128i zero = _mm_setzero_si128 ();
|
||||
|
||||
for( ; x <= size.width - 16; x += 16 )
|
||||
{
|
||||
const __m128i rSrc = _mm_lddqu_si128((const __m128i*)(src+x));
|
||||
__m128i _mask = _mm_lddqu_si128((const __m128i*)(mask+x));
|
||||
__m128i rDst = _mm_lddqu_si128((__m128i*)(dst+x));
|
||||
__m128i _negMask = _mm_cmpeq_epi8(_mask, zero);
|
||||
rDst = _mm_blendv_epi8(rSrc, rDst, _negMask);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), rDst);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
for( ; x < size.width; x++ )
|
||||
if( mask[x] )
|
||||
@@ -113,24 +113,24 @@ copyMask_<ushort>(const uchar* _src, size_t sstep, const uchar* mask, size_t mst
|
||||
{
|
||||
for( ; size.height--; mask += mstep, _src += sstep, _dst += dstep )
|
||||
{
|
||||
const ushort* src = (const ushort*)_src;
|
||||
const ushort* src = (const ushort*)_src;
|
||||
ushort* dst = (ushort*)_dst;
|
||||
int x = 0;
|
||||
#if CV_SSE4_2
|
||||
if(USE_SSE4_2)//
|
||||
{
|
||||
__m128i zero = _mm_setzero_si128 ();
|
||||
for( ; x <= size.width - 8; x += 8 )
|
||||
{
|
||||
const __m128i rSrc =_mm_lddqu_si128((const __m128i*)(src+x));
|
||||
__m128i _mask = _mm_loadl_epi64((const __m128i*)(mask+x));
|
||||
_mask = _mm_unpacklo_epi8(_mask, _mask);
|
||||
__m128i rDst = _mm_lddqu_si128((const __m128i*)(dst+x));
|
||||
__m128i _negMask = _mm_cmpeq_epi8(_mask, zero);
|
||||
rDst = _mm_blendv_epi8(rSrc, rDst, _negMask);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), rDst);
|
||||
}
|
||||
}
|
||||
if(USE_SSE4_2)//
|
||||
{
|
||||
__m128i zero = _mm_setzero_si128 ();
|
||||
for( ; x <= size.width - 8; x += 8 )
|
||||
{
|
||||
const __m128i rSrc =_mm_lddqu_si128((const __m128i*)(src+x));
|
||||
__m128i _mask = _mm_loadl_epi64((const __m128i*)(mask+x));
|
||||
_mask = _mm_unpacklo_epi8(_mask, _mask);
|
||||
__m128i rDst = _mm_lddqu_si128((const __m128i*)(dst+x));
|
||||
__m128i _negMask = _mm_cmpeq_epi8(_mask, zero);
|
||||
rDst = _mm_blendv_epi8(rSrc, rDst, _negMask);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), rDst);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
for( ; x < size.width; x++ )
|
||||
if( mask[x] )
|
||||
|
@@ -1,343 +1,343 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's 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.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
|
||||
#include "opencv2/gpu/device/saturate_cast.hpp"
|
||||
#include "opencv2/gpu/device/transform.hpp"
|
||||
#include "opencv2/gpu/device/functional.hpp"
|
||||
|
||||
namespace cv { namespace gpu { namespace device
|
||||
{
|
||||
void writeScalar(const uchar*);
|
||||
void writeScalar(const schar*);
|
||||
void writeScalar(const ushort*);
|
||||
void writeScalar(const short int*);
|
||||
void writeScalar(const int*);
|
||||
void writeScalar(const float*);
|
||||
void writeScalar(const double*);
|
||||
void convert_gpu(PtrStepSzb, int, PtrStepSzb, int, double, double, cudaStream_t);
|
||||
}}}
|
||||
|
||||
namespace cv { namespace gpu { namespace device
|
||||
{
|
||||
template <typename T> struct shift_and_sizeof;
|
||||
template <> struct shift_and_sizeof<signed char> { enum { shift = 0 }; };
|
||||
template <> struct shift_and_sizeof<unsigned char> { enum { shift = 0 }; };
|
||||
template <> struct shift_and_sizeof<short> { enum { shift = 1 }; };
|
||||
template <> struct shift_and_sizeof<unsigned short> { enum { shift = 1 }; };
|
||||
template <> struct shift_and_sizeof<int> { enum { shift = 2 }; };
|
||||
template <> struct shift_and_sizeof<float> { enum { shift = 2 }; };
|
||||
template <> struct shift_and_sizeof<double> { enum { shift = 3 }; };
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////// CopyTo /////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template <typename T> void copyToWithMask(PtrStepSzb src, PtrStepSzb dst, int cn, PtrStepSzb mask, bool colorMask, cudaStream_t stream)
|
||||
{
|
||||
if (colorMask)
|
||||
cv::gpu::device::transform((PtrStepSz<T>)src, (PtrStepSz<T>)dst, identity<T>(), SingleMask(mask), stream);
|
||||
else
|
||||
cv::gpu::device::transform((PtrStepSz<T>)src, (PtrStepSz<T>)dst, identity<T>(), SingleMaskChannels(mask, cn), stream);
|
||||
}
|
||||
|
||||
void copyToWithMask_gpu(PtrStepSzb src, PtrStepSzb dst, size_t elemSize1, int cn, PtrStepSzb mask, bool colorMask, cudaStream_t stream)
|
||||
{
|
||||
typedef void (*func_t)(PtrStepSzb src, PtrStepSzb dst, int cn, PtrStepSzb mask, bool colorMask, cudaStream_t stream);
|
||||
|
||||
static func_t tab[] =
|
||||
{
|
||||
0,
|
||||
copyToWithMask<unsigned char>,
|
||||
copyToWithMask<unsigned short>,
|
||||
0,
|
||||
copyToWithMask<int>,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
copyToWithMask<double>
|
||||
};
|
||||
|
||||
tab[elemSize1](src, dst, cn, mask, colorMask, stream);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////// SetTo //////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
__constant__ uchar scalar_8u[4];
|
||||
__constant__ schar scalar_8s[4];
|
||||
__constant__ ushort scalar_16u[4];
|
||||
__constant__ short scalar_16s[4];
|
||||
__constant__ int scalar_32s[4];
|
||||
__constant__ float scalar_32f[4];
|
||||
__constant__ double scalar_64f[4];
|
||||
|
||||
template <typename T> __device__ __forceinline__ T readScalar(int i);
|
||||
template <> __device__ __forceinline__ uchar readScalar<uchar>(int i) {return scalar_8u[i];}
|
||||
template <> __device__ __forceinline__ schar readScalar<schar>(int i) {return scalar_8s[i];}
|
||||
template <> __device__ __forceinline__ ushort readScalar<ushort>(int i) {return scalar_16u[i];}
|
||||
template <> __device__ __forceinline__ short readScalar<short>(int i) {return scalar_16s[i];}
|
||||
template <> __device__ __forceinline__ int readScalar<int>(int i) {return scalar_32s[i];}
|
||||
template <> __device__ __forceinline__ float readScalar<float>(int i) {return scalar_32f[i];}
|
||||
template <> __device__ __forceinline__ double readScalar<double>(int i) {return scalar_64f[i];}
|
||||
|
||||
void writeScalar(const uchar* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_8u, vals, sizeof(uchar) * 4) );
|
||||
}
|
||||
void writeScalar(const schar* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_8s, vals, sizeof(schar) * 4) );
|
||||
}
|
||||
void writeScalar(const ushort* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_16u, vals, sizeof(ushort) * 4) );
|
||||
}
|
||||
void writeScalar(const short* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_16s, vals, sizeof(short) * 4) );
|
||||
}
|
||||
void writeScalar(const int* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_32s, vals, sizeof(int) * 4) );
|
||||
}
|
||||
void writeScalar(const float* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_32f, vals, sizeof(float) * 4) );
|
||||
}
|
||||
void writeScalar(const double* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_64f, vals, sizeof(double) * 4) );
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
__global__ void set_to_without_mask(T* mat, int cols, int rows, size_t step, int channels)
|
||||
{
|
||||
size_t x = blockIdx.x * blockDim.x + threadIdx.x;
|
||||
size_t y = blockIdx.y * blockDim.y + threadIdx.y;
|
||||
|
||||
if ((x < cols * channels ) && (y < rows))
|
||||
{
|
||||
size_t idx = y * ( step >> shift_and_sizeof<T>::shift ) + x;
|
||||
mat[idx] = readScalar<T>(x % channels);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
__global__ void set_to_with_mask(T* mat, const uchar* mask, int cols, int rows, size_t step, int channels, size_t step_mask)
|
||||
{
|
||||
size_t x = blockIdx.x * blockDim.x + threadIdx.x;
|
||||
size_t y = blockIdx.y * blockDim.y + threadIdx.y;
|
||||
|
||||
if ((x < cols * channels ) && (y < rows))
|
||||
if (mask[y * step_mask + x / channels] != 0)
|
||||
{
|
||||
size_t idx = y * ( step >> shift_and_sizeof<T>::shift ) + x;
|
||||
mat[idx] = readScalar<T>(x % channels);
|
||||
}
|
||||
}
|
||||
template <typename T>
|
||||
void set_to_gpu(PtrStepSzb mat, const T* scalar, PtrStepSzb mask, int channels, cudaStream_t stream)
|
||||
{
|
||||
writeScalar(scalar);
|
||||
|
||||
dim3 threadsPerBlock(32, 8, 1);
|
||||
dim3 numBlocks (mat.cols * channels / threadsPerBlock.x + 1, mat.rows / threadsPerBlock.y + 1, 1);
|
||||
|
||||
set_to_with_mask<T><<<numBlocks, threadsPerBlock, 0, stream>>>((T*)mat.data, (uchar*)mask.data, mat.cols, mat.rows, mat.step, channels, mask.step);
|
||||
cudaSafeCall( cudaGetLastError() );
|
||||
|
||||
if (stream == 0)
|
||||
cudaSafeCall ( cudaDeviceSynchronize() );
|
||||
}
|
||||
|
||||
template void set_to_gpu<uchar >(PtrStepSzb mat, const uchar* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<schar >(PtrStepSzb mat, const schar* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<ushort>(PtrStepSzb mat, const ushort* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<short >(PtrStepSzb mat, const short* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<int >(PtrStepSzb mat, const int* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<float >(PtrStepSzb mat, const float* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<double>(PtrStepSzb mat, const double* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void set_to_gpu(PtrStepSzb mat, const T* scalar, int channels, cudaStream_t stream)
|
||||
{
|
||||
writeScalar(scalar);
|
||||
|
||||
dim3 threadsPerBlock(32, 8, 1);
|
||||
dim3 numBlocks (mat.cols * channels / threadsPerBlock.x + 1, mat.rows / threadsPerBlock.y + 1, 1);
|
||||
|
||||
set_to_without_mask<T><<<numBlocks, threadsPerBlock, 0, stream>>>((T*)mat.data, mat.cols, mat.rows, mat.step, channels);
|
||||
cudaSafeCall( cudaGetLastError() );
|
||||
|
||||
if (stream == 0)
|
||||
cudaSafeCall ( cudaDeviceSynchronize() );
|
||||
}
|
||||
|
||||
template void set_to_gpu<uchar >(PtrStepSzb mat, const uchar* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<schar >(PtrStepSzb mat, const schar* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<ushort>(PtrStepSzb mat, const ushort* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<short >(PtrStepSzb mat, const short* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<int >(PtrStepSzb mat, const int* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<float >(PtrStepSzb mat, const float* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<double>(PtrStepSzb mat, const double* scalar, int channels, cudaStream_t stream);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////// ConvertTo ////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template <typename T, typename D> struct Convertor : unary_function<T, D>
|
||||
{
|
||||
Convertor(double alpha_, double beta_) : alpha(alpha_), beta(beta_) {}
|
||||
|
||||
__device__ __forceinline__ D operator()(const T& src) const
|
||||
{
|
||||
return saturate_cast<D>(alpha * src + beta);
|
||||
}
|
||||
|
||||
double alpha, beta;
|
||||
};
|
||||
|
||||
namespace detail
|
||||
{
|
||||
template <size_t src_size, size_t dst_size, typename F> struct ConvertTraitsDispatcher : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
};
|
||||
template <typename F> struct ConvertTraitsDispatcher<1, 1, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_shift = 8 };
|
||||
};
|
||||
template <typename F> struct ConvertTraitsDispatcher<1, 2, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_shift = 4 };
|
||||
};
|
||||
template <typename F> struct ConvertTraitsDispatcher<1, 4, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_block_dim_y = 8 };
|
||||
enum { smart_shift = 4 };
|
||||
};
|
||||
|
||||
template <typename F> struct ConvertTraitsDispatcher<2, 2, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_shift = 4 };
|
||||
};
|
||||
template <typename F> struct ConvertTraitsDispatcher<2, 4, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_shift = 2 };
|
||||
};
|
||||
|
||||
template <typename F> struct ConvertTraitsDispatcher<4, 2, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_block_dim_y = 8 };
|
||||
enum { smart_shift = 4 };
|
||||
};
|
||||
template <typename F> struct ConvertTraitsDispatcher<4, 4, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_block_dim_y = 8 };
|
||||
enum { smart_shift = 2 };
|
||||
};
|
||||
|
||||
template <typename F> struct ConvertTraits : ConvertTraitsDispatcher<sizeof(typename F::argument_type), sizeof(typename F::result_type), F>
|
||||
{
|
||||
};
|
||||
}
|
||||
|
||||
template <typename T, typename D> struct TransformFunctorTraits< Convertor<T, D> > : detail::ConvertTraits< Convertor<T, D> >
|
||||
{
|
||||
};
|
||||
|
||||
template<typename T, typename D>
|
||||
void cvt_(PtrStepSzb src, PtrStepSzb dst, double alpha, double beta, cudaStream_t stream)
|
||||
{
|
||||
cudaSafeCall( cudaSetDoubleForDevice(&alpha) );
|
||||
cudaSafeCall( cudaSetDoubleForDevice(&beta) );
|
||||
Convertor<T, D> op(alpha, beta);
|
||||
cv::gpu::device::transform((PtrStepSz<T>)src, (PtrStepSz<D>)dst, op, WithOutMask(), stream);
|
||||
}
|
||||
|
||||
#if defined __clang__
|
||||
# pragma clang diagnostic push
|
||||
# pragma clang diagnostic ignored "-Wmissing-declarations"
|
||||
#endif
|
||||
|
||||
void convert_gpu(PtrStepSzb src, int sdepth, PtrStepSzb dst, int ddepth, double alpha, double beta, cudaStream_t stream)
|
||||
{
|
||||
typedef void (*caller_t)(PtrStepSzb src, PtrStepSzb dst, double alpha, double beta, cudaStream_t stream);
|
||||
|
||||
static const caller_t tab[8][8] =
|
||||
{
|
||||
{cvt_<uchar, uchar>, cvt_<uchar, schar>, cvt_<uchar, ushort>, cvt_<uchar, short>,
|
||||
cvt_<uchar, int>, cvt_<uchar, float>, cvt_<uchar, double>, 0},
|
||||
|
||||
{cvt_<schar, uchar>, cvt_<schar, schar>, cvt_<schar, ushort>, cvt_<schar, short>,
|
||||
cvt_<schar, int>, cvt_<schar, float>, cvt_<schar, double>, 0},
|
||||
|
||||
{cvt_<ushort, uchar>, cvt_<ushort, schar>, cvt_<ushort, ushort>, cvt_<ushort, short>,
|
||||
cvt_<ushort, int>, cvt_<ushort, float>, cvt_<ushort, double>, 0},
|
||||
|
||||
{cvt_<short, uchar>, cvt_<short, schar>, cvt_<short, ushort>, cvt_<short, short>,
|
||||
cvt_<short, int>, cvt_<short, float>, cvt_<short, double>, 0},
|
||||
|
||||
{cvt_<int, uchar>, cvt_<int, schar>, cvt_<int, ushort>,
|
||||
cvt_<int, short>, cvt_<int, int>, cvt_<int, float>, cvt_<int, double>, 0},
|
||||
|
||||
{cvt_<float, uchar>, cvt_<float, schar>, cvt_<float, ushort>,
|
||||
cvt_<float, short>, cvt_<float, int>, cvt_<float, float>, cvt_<float, double>, 0},
|
||||
|
||||
{cvt_<double, uchar>, cvt_<double, schar>, cvt_<double, ushort>,
|
||||
cvt_<double, short>, cvt_<double, int>, cvt_<double, float>, cvt_<double, double>, 0},
|
||||
|
||||
{0,0,0,0,0,0,0,0}
|
||||
};
|
||||
|
||||
caller_t func = tab[sdepth][ddepth];
|
||||
if (!func)
|
||||
cv::gpu::error("Unsupported convert operation", __FILE__, __LINE__, "convert_gpu");
|
||||
|
||||
func(src, dst, alpha, beta, stream);
|
||||
}
|
||||
|
||||
#if defined __clang__
|
||||
# pragma clang diagnostic pop
|
||||
#endif
|
||||
}}} // namespace cv { namespace gpu { namespace device
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's 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.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
|
||||
#include "opencv2/gpu/device/saturate_cast.hpp"
|
||||
#include "opencv2/gpu/device/transform.hpp"
|
||||
#include "opencv2/gpu/device/functional.hpp"
|
||||
|
||||
namespace cv { namespace gpu { namespace device
|
||||
{
|
||||
void writeScalar(const uchar*);
|
||||
void writeScalar(const schar*);
|
||||
void writeScalar(const ushort*);
|
||||
void writeScalar(const short int*);
|
||||
void writeScalar(const int*);
|
||||
void writeScalar(const float*);
|
||||
void writeScalar(const double*);
|
||||
void convert_gpu(PtrStepSzb, int, PtrStepSzb, int, double, double, cudaStream_t);
|
||||
}}}
|
||||
|
||||
namespace cv { namespace gpu { namespace device
|
||||
{
|
||||
template <typename T> struct shift_and_sizeof;
|
||||
template <> struct shift_and_sizeof<signed char> { enum { shift = 0 }; };
|
||||
template <> struct shift_and_sizeof<unsigned char> { enum { shift = 0 }; };
|
||||
template <> struct shift_and_sizeof<short> { enum { shift = 1 }; };
|
||||
template <> struct shift_and_sizeof<unsigned short> { enum { shift = 1 }; };
|
||||
template <> struct shift_and_sizeof<int> { enum { shift = 2 }; };
|
||||
template <> struct shift_and_sizeof<float> { enum { shift = 2 }; };
|
||||
template <> struct shift_and_sizeof<double> { enum { shift = 3 }; };
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////// CopyTo /////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template <typename T> void copyToWithMask(PtrStepSzb src, PtrStepSzb dst, int cn, PtrStepSzb mask, bool colorMask, cudaStream_t stream)
|
||||
{
|
||||
if (colorMask)
|
||||
cv::gpu::device::transform((PtrStepSz<T>)src, (PtrStepSz<T>)dst, identity<T>(), SingleMask(mask), stream);
|
||||
else
|
||||
cv::gpu::device::transform((PtrStepSz<T>)src, (PtrStepSz<T>)dst, identity<T>(), SingleMaskChannels(mask, cn), stream);
|
||||
}
|
||||
|
||||
void copyToWithMask_gpu(PtrStepSzb src, PtrStepSzb dst, size_t elemSize1, int cn, PtrStepSzb mask, bool colorMask, cudaStream_t stream)
|
||||
{
|
||||
typedef void (*func_t)(PtrStepSzb src, PtrStepSzb dst, int cn, PtrStepSzb mask, bool colorMask, cudaStream_t stream);
|
||||
|
||||
static func_t tab[] =
|
||||
{
|
||||
0,
|
||||
copyToWithMask<unsigned char>,
|
||||
copyToWithMask<unsigned short>,
|
||||
0,
|
||||
copyToWithMask<int>,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
copyToWithMask<double>
|
||||
};
|
||||
|
||||
tab[elemSize1](src, dst, cn, mask, colorMask, stream);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////// SetTo //////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
__constant__ uchar scalar_8u[4];
|
||||
__constant__ schar scalar_8s[4];
|
||||
__constant__ ushort scalar_16u[4];
|
||||
__constant__ short scalar_16s[4];
|
||||
__constant__ int scalar_32s[4];
|
||||
__constant__ float scalar_32f[4];
|
||||
__constant__ double scalar_64f[4];
|
||||
|
||||
template <typename T> __device__ __forceinline__ T readScalar(int i);
|
||||
template <> __device__ __forceinline__ uchar readScalar<uchar>(int i) {return scalar_8u[i];}
|
||||
template <> __device__ __forceinline__ schar readScalar<schar>(int i) {return scalar_8s[i];}
|
||||
template <> __device__ __forceinline__ ushort readScalar<ushort>(int i) {return scalar_16u[i];}
|
||||
template <> __device__ __forceinline__ short readScalar<short>(int i) {return scalar_16s[i];}
|
||||
template <> __device__ __forceinline__ int readScalar<int>(int i) {return scalar_32s[i];}
|
||||
template <> __device__ __forceinline__ float readScalar<float>(int i) {return scalar_32f[i];}
|
||||
template <> __device__ __forceinline__ double readScalar<double>(int i) {return scalar_64f[i];}
|
||||
|
||||
void writeScalar(const uchar* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_8u, vals, sizeof(uchar) * 4) );
|
||||
}
|
||||
void writeScalar(const schar* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_8s, vals, sizeof(schar) * 4) );
|
||||
}
|
||||
void writeScalar(const ushort* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_16u, vals, sizeof(ushort) * 4) );
|
||||
}
|
||||
void writeScalar(const short* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_16s, vals, sizeof(short) * 4) );
|
||||
}
|
||||
void writeScalar(const int* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_32s, vals, sizeof(int) * 4) );
|
||||
}
|
||||
void writeScalar(const float* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_32f, vals, sizeof(float) * 4) );
|
||||
}
|
||||
void writeScalar(const double* vals)
|
||||
{
|
||||
cudaSafeCall( cudaMemcpyToSymbol(scalar_64f, vals, sizeof(double) * 4) );
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
__global__ void set_to_without_mask(T* mat, int cols, int rows, size_t step, int channels)
|
||||
{
|
||||
size_t x = blockIdx.x * blockDim.x + threadIdx.x;
|
||||
size_t y = blockIdx.y * blockDim.y + threadIdx.y;
|
||||
|
||||
if ((x < cols * channels ) && (y < rows))
|
||||
{
|
||||
size_t idx = y * ( step >> shift_and_sizeof<T>::shift ) + x;
|
||||
mat[idx] = readScalar<T>(x % channels);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
__global__ void set_to_with_mask(T* mat, const uchar* mask, int cols, int rows, size_t step, int channels, size_t step_mask)
|
||||
{
|
||||
size_t x = blockIdx.x * blockDim.x + threadIdx.x;
|
||||
size_t y = blockIdx.y * blockDim.y + threadIdx.y;
|
||||
|
||||
if ((x < cols * channels ) && (y < rows))
|
||||
if (mask[y * step_mask + x / channels] != 0)
|
||||
{
|
||||
size_t idx = y * ( step >> shift_and_sizeof<T>::shift ) + x;
|
||||
mat[idx] = readScalar<T>(x % channels);
|
||||
}
|
||||
}
|
||||
template <typename T>
|
||||
void set_to_gpu(PtrStepSzb mat, const T* scalar, PtrStepSzb mask, int channels, cudaStream_t stream)
|
||||
{
|
||||
writeScalar(scalar);
|
||||
|
||||
dim3 threadsPerBlock(32, 8, 1);
|
||||
dim3 numBlocks (mat.cols * channels / threadsPerBlock.x + 1, mat.rows / threadsPerBlock.y + 1, 1);
|
||||
|
||||
set_to_with_mask<T><<<numBlocks, threadsPerBlock, 0, stream>>>((T*)mat.data, (uchar*)mask.data, mat.cols, mat.rows, mat.step, channels, mask.step);
|
||||
cudaSafeCall( cudaGetLastError() );
|
||||
|
||||
if (stream == 0)
|
||||
cudaSafeCall ( cudaDeviceSynchronize() );
|
||||
}
|
||||
|
||||
template void set_to_gpu<uchar >(PtrStepSzb mat, const uchar* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<schar >(PtrStepSzb mat, const schar* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<ushort>(PtrStepSzb mat, const ushort* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<short >(PtrStepSzb mat, const short* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<int >(PtrStepSzb mat, const int* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<float >(PtrStepSzb mat, const float* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<double>(PtrStepSzb mat, const double* scalar, PtrStepSzb mask, int channels, cudaStream_t stream);
|
||||
|
||||
template <typename T>
|
||||
void set_to_gpu(PtrStepSzb mat, const T* scalar, int channels, cudaStream_t stream)
|
||||
{
|
||||
writeScalar(scalar);
|
||||
|
||||
dim3 threadsPerBlock(32, 8, 1);
|
||||
dim3 numBlocks (mat.cols * channels / threadsPerBlock.x + 1, mat.rows / threadsPerBlock.y + 1, 1);
|
||||
|
||||
set_to_without_mask<T><<<numBlocks, threadsPerBlock, 0, stream>>>((T*)mat.data, mat.cols, mat.rows, mat.step, channels);
|
||||
cudaSafeCall( cudaGetLastError() );
|
||||
|
||||
if (stream == 0)
|
||||
cudaSafeCall ( cudaDeviceSynchronize() );
|
||||
}
|
||||
|
||||
template void set_to_gpu<uchar >(PtrStepSzb mat, const uchar* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<schar >(PtrStepSzb mat, const schar* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<ushort>(PtrStepSzb mat, const ushort* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<short >(PtrStepSzb mat, const short* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<int >(PtrStepSzb mat, const int* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<float >(PtrStepSzb mat, const float* scalar, int channels, cudaStream_t stream);
|
||||
template void set_to_gpu<double>(PtrStepSzb mat, const double* scalar, int channels, cudaStream_t stream);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////// ConvertTo ////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template <typename T, typename D> struct Convertor : unary_function<T, D>
|
||||
{
|
||||
Convertor(double alpha_, double beta_) : alpha(alpha_), beta(beta_) {}
|
||||
|
||||
__device__ __forceinline__ D operator()(const T& src) const
|
||||
{
|
||||
return saturate_cast<D>(alpha * src + beta);
|
||||
}
|
||||
|
||||
double alpha, beta;
|
||||
};
|
||||
|
||||
namespace detail
|
||||
{
|
||||
template <size_t src_size, size_t dst_size, typename F> struct ConvertTraitsDispatcher : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
};
|
||||
template <typename F> struct ConvertTraitsDispatcher<1, 1, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_shift = 8 };
|
||||
};
|
||||
template <typename F> struct ConvertTraitsDispatcher<1, 2, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_shift = 4 };
|
||||
};
|
||||
template <typename F> struct ConvertTraitsDispatcher<1, 4, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_block_dim_y = 8 };
|
||||
enum { smart_shift = 4 };
|
||||
};
|
||||
|
||||
template <typename F> struct ConvertTraitsDispatcher<2, 2, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_shift = 4 };
|
||||
};
|
||||
template <typename F> struct ConvertTraitsDispatcher<2, 4, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_shift = 2 };
|
||||
};
|
||||
|
||||
template <typename F> struct ConvertTraitsDispatcher<4, 2, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_block_dim_y = 8 };
|
||||
enum { smart_shift = 4 };
|
||||
};
|
||||
template <typename F> struct ConvertTraitsDispatcher<4, 4, F> : DefaultTransformFunctorTraits<F>
|
||||
{
|
||||
enum { smart_block_dim_y = 8 };
|
||||
enum { smart_shift = 2 };
|
||||
};
|
||||
|
||||
template <typename F> struct ConvertTraits : ConvertTraitsDispatcher<sizeof(typename F::argument_type), sizeof(typename F::result_type), F>
|
||||
{
|
||||
};
|
||||
}
|
||||
|
||||
template <typename T, typename D> struct TransformFunctorTraits< Convertor<T, D> > : detail::ConvertTraits< Convertor<T, D> >
|
||||
{
|
||||
};
|
||||
|
||||
template<typename T, typename D>
|
||||
void cvt_(PtrStepSzb src, PtrStepSzb dst, double alpha, double beta, cudaStream_t stream)
|
||||
{
|
||||
cudaSafeCall( cudaSetDoubleForDevice(&alpha) );
|
||||
cudaSafeCall( cudaSetDoubleForDevice(&beta) );
|
||||
Convertor<T, D> op(alpha, beta);
|
||||
cv::gpu::device::transform((PtrStepSz<T>)src, (PtrStepSz<D>)dst, op, WithOutMask(), stream);
|
||||
}
|
||||
|
||||
#if defined __clang__
|
||||
# pragma clang diagnostic push
|
||||
# pragma clang diagnostic ignored "-Wmissing-declarations"
|
||||
#endif
|
||||
|
||||
void convert_gpu(PtrStepSzb src, int sdepth, PtrStepSzb dst, int ddepth, double alpha, double beta, cudaStream_t stream)
|
||||
{
|
||||
typedef void (*caller_t)(PtrStepSzb src, PtrStepSzb dst, double alpha, double beta, cudaStream_t stream);
|
||||
|
||||
static const caller_t tab[8][8] =
|
||||
{
|
||||
{cvt_<uchar, uchar>, cvt_<uchar, schar>, cvt_<uchar, ushort>, cvt_<uchar, short>,
|
||||
cvt_<uchar, int>, cvt_<uchar, float>, cvt_<uchar, double>, 0},
|
||||
|
||||
{cvt_<schar, uchar>, cvt_<schar, schar>, cvt_<schar, ushort>, cvt_<schar, short>,
|
||||
cvt_<schar, int>, cvt_<schar, float>, cvt_<schar, double>, 0},
|
||||
|
||||
{cvt_<ushort, uchar>, cvt_<ushort, schar>, cvt_<ushort, ushort>, cvt_<ushort, short>,
|
||||
cvt_<ushort, int>, cvt_<ushort, float>, cvt_<ushort, double>, 0},
|
||||
|
||||
{cvt_<short, uchar>, cvt_<short, schar>, cvt_<short, ushort>, cvt_<short, short>,
|
||||
cvt_<short, int>, cvt_<short, float>, cvt_<short, double>, 0},
|
||||
|
||||
{cvt_<int, uchar>, cvt_<int, schar>, cvt_<int, ushort>,
|
||||
cvt_<int, short>, cvt_<int, int>, cvt_<int, float>, cvt_<int, double>, 0},
|
||||
|
||||
{cvt_<float, uchar>, cvt_<float, schar>, cvt_<float, ushort>,
|
||||
cvt_<float, short>, cvt_<float, int>, cvt_<float, float>, cvt_<float, double>, 0},
|
||||
|
||||
{cvt_<double, uchar>, cvt_<double, schar>, cvt_<double, ushort>,
|
||||
cvt_<double, short>, cvt_<double, int>, cvt_<double, float>, cvt_<double, double>, 0},
|
||||
|
||||
{0,0,0,0,0,0,0,0}
|
||||
};
|
||||
|
||||
caller_t func = tab[sdepth][ddepth];
|
||||
if (!func)
|
||||
cv::gpu::error("Unsupported convert operation", __FILE__, __LINE__, "convert_gpu");
|
||||
|
||||
func(src, dst, alpha, beta, stream);
|
||||
}
|
||||
|
||||
#if defined __clang__
|
||||
# pragma clang diagnostic pop
|
||||
#endif
|
||||
}}} // namespace cv { namespace gpu { namespace device
|
||||
|
@@ -128,7 +128,7 @@ DFTFactorize( int n, int* factors )
|
||||
factors[0] = n;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
f = (((n - 1)^n)+1) >> 1;
|
||||
if( f > 1 )
|
||||
{
|
||||
@@ -176,7 +176,7 @@ DFTInit( int n0, int nf, int* factors, int* itab, int elem_size, void* _wave, in
|
||||
{
|
||||
itab[0] = 0;
|
||||
itab[n0-1] = n0-1;
|
||||
|
||||
|
||||
if( n0 != 4 )
|
||||
{
|
||||
for( i = 1; i < n0-1; i++ )
|
||||
@@ -338,7 +338,7 @@ DFTInit( int n0, int nf, int* factors, int* itab, int elem_size, void* _wave, in
|
||||
{
|
||||
Complex<float>* wave = (Complex<float>*)_wave;
|
||||
assert( elem_size == sizeof(Complex<float>) );
|
||||
|
||||
|
||||
wave[0].re = 1.f;
|
||||
wave[0].im = 0.f;
|
||||
|
||||
@@ -379,25 +379,25 @@ template<> struct DFT_VecR4<float>
|
||||
Cv32suf t; t.i = 0x80000000;
|
||||
__m128 neg0_mask = _mm_load_ss(&t.f);
|
||||
__m128 neg3_mask = _mm_shuffle_ps(neg0_mask, neg0_mask, _MM_SHUFFLE(0,1,2,3));
|
||||
|
||||
|
||||
for( ; n*4 <= N; )
|
||||
{
|
||||
nx = n;
|
||||
n *= 4;
|
||||
dw0 /= 4;
|
||||
|
||||
|
||||
for( i = 0; i < n0; i += n )
|
||||
{
|
||||
Complexf *v0, *v1;
|
||||
|
||||
|
||||
v0 = dst + i;
|
||||
v1 = v0 + nx*2;
|
||||
|
||||
|
||||
x02 = _mm_loadl_pi(x02, (const __m64*)&v0[0]);
|
||||
x13 = _mm_loadl_pi(x13, (const __m64*)&v0[nx]);
|
||||
x02 = _mm_loadh_pi(x02, (const __m64*)&v1[0]);
|
||||
x13 = _mm_loadh_pi(x13, (const __m64*)&v1[nx]);
|
||||
|
||||
|
||||
y01 = _mm_add_ps(x02, x13);
|
||||
y23 = _mm_sub_ps(x02, x13);
|
||||
t1 = _mm_xor_ps(_mm_shuffle_ps(y01, y23, _MM_SHUFFLE(2,3,3,2)), neg3_mask);
|
||||
@@ -409,7 +409,7 @@ template<> struct DFT_VecR4<float>
|
||||
_mm_storeh_pi((__m64*)&v0[nx], y01);
|
||||
_mm_storel_pi((__m64*)&v1[0], y23);
|
||||
_mm_storeh_pi((__m64*)&v1[nx], y23);
|
||||
|
||||
|
||||
for( j = 1, dw = dw0; j < nx; j++, dw += dw0 )
|
||||
{
|
||||
v0 = dst + i + j;
|
||||
@@ -419,7 +419,7 @@ template<> struct DFT_VecR4<float>
|
||||
w23 = _mm_loadl_pi(w23, (const __m64*)&wave[dw*2]);
|
||||
x13 = _mm_loadh_pi(x13, (const __m64*)&v1[nx]); // x1, x3 = r1 i1 r3 i3
|
||||
w23 = _mm_loadh_pi(w23, (const __m64*)&wave[dw*3]); // w2, w3 = wr2 wi2 wr3 wi3
|
||||
|
||||
|
||||
t0 = _mm_mul_ps(_mm_moveldup_ps(x13), w23);
|
||||
t1 = _mm_mul_ps(_mm_movehdup_ps(x13), _mm_shuffle_ps(w23, w23, _MM_SHUFFLE(2,3,0,1)));
|
||||
x13 = _mm_addsub_ps(t0, t1);
|
||||
@@ -432,7 +432,7 @@ template<> struct DFT_VecR4<float>
|
||||
x02 = _mm_addsub_ps(x02, _mm_movelh_ps(x02, x02));
|
||||
// re(x0) im(x0) re(x2*w1), im(x2*w1)
|
||||
x02 = _mm_loadl_pi(x02, (const __m64*)&v0[0]);
|
||||
|
||||
|
||||
y01 = _mm_add_ps(x02, x13);
|
||||
y23 = _mm_sub_ps(x02, x13);
|
||||
t1 = _mm_xor_ps(_mm_shuffle_ps(y01, y23, _MM_SHUFFLE(2,3,3,2)), neg3_mask);
|
||||
@@ -447,7 +447,7 @@ template<> struct DFT_VecR4<float>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
_dw0 = dw0;
|
||||
return n;
|
||||
}
|
||||
@@ -460,52 +460,52 @@ static void ippsDFTFwd_CToC( const Complex<float>* src, Complex<float>* dst,
|
||||
const void* spec, uchar* buf)
|
||||
{
|
||||
ippsDFTFwd_CToC_32fc( (const Ipp32fc*)src, (Ipp32fc*)dst,
|
||||
(const IppsDFTSpec_C_32fc*)spec, buf);
|
||||
(const IppsDFTSpec_C_32fc*)spec, buf);
|
||||
}
|
||||
|
||||
static void ippsDFTFwd_CToC( const Complex<double>* src, Complex<double>* dst,
|
||||
const void* spec, uchar* buf)
|
||||
{
|
||||
ippsDFTFwd_CToC_64fc( (const Ipp64fc*)src, (Ipp64fc*)dst,
|
||||
(const IppsDFTSpec_C_64fc*)spec, buf);
|
||||
(const IppsDFTSpec_C_64fc*)spec, buf);
|
||||
}
|
||||
|
||||
static void ippsDFTInv_CToC( const Complex<float>* src, Complex<float>* dst,
|
||||
const void* spec, uchar* buf)
|
||||
{
|
||||
ippsDFTInv_CToC_32fc( (const Ipp32fc*)src, (Ipp32fc*)dst,
|
||||
(const IppsDFTSpec_C_32fc*)spec, buf);
|
||||
(const IppsDFTSpec_C_32fc*)spec, buf);
|
||||
}
|
||||
|
||||
static void ippsDFTInv_CToC( const Complex<double>* src, Complex<double>* dst,
|
||||
const void* spec, uchar* buf)
|
||||
{
|
||||
ippsDFTInv_CToC_64fc( (const Ipp64fc*)src, (Ipp64fc*)dst,
|
||||
(const IppsDFTSpec_C_64fc*)spec, buf);
|
||||
(const IppsDFTSpec_C_64fc*)spec, buf);
|
||||
}
|
||||
|
||||
static void ippsDFTFwd_RToPack( const float* src, float* dst,
|
||||
const void* spec, uchar* buf)
|
||||
{
|
||||
ippsDFTFwd_RToPack_32f( src, dst, (const IppsDFTSpec_R_32f*)spec, buf);
|
||||
ippsDFTFwd_RToPack_32f( src, dst, (const IppsDFTSpec_R_32f*)spec, buf);
|
||||
}
|
||||
|
||||
static void ippsDFTFwd_RToPack( const double* src, double* dst,
|
||||
const void* spec, uchar* buf)
|
||||
{
|
||||
ippsDFTFwd_RToPack_64f( src, dst, (const IppsDFTSpec_R_64f*)spec, buf);
|
||||
ippsDFTFwd_RToPack_64f( src, dst, (const IppsDFTSpec_R_64f*)spec, buf);
|
||||
}
|
||||
|
||||
static void ippsDFTInv_PackToR( const float* src, float* dst,
|
||||
const void* spec, uchar* buf)
|
||||
{
|
||||
ippsDFTInv_PackToR_32f( src, dst, (const IppsDFTSpec_R_32f*)spec, buf);
|
||||
ippsDFTInv_PackToR_32f( src, dst, (const IppsDFTSpec_R_32f*)spec, buf);
|
||||
}
|
||||
|
||||
static void ippsDFTInv_PackToR( const double* src, double* dst,
|
||||
const void* spec, uchar* buf)
|
||||
{
|
||||
ippsDFTInv_PackToR_64f( src, dst, (const IppsDFTSpec_R_64f*)spec, buf);
|
||||
ippsDFTInv_PackToR_64f( src, dst, (const IppsDFTSpec_R_64f*)spec, buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -596,7 +596,7 @@ DFT( const Complex<T>* src, Complex<T>* dst, int n,
|
||||
{
|
||||
int n2 = n/2;
|
||||
Complex<T>* dsth = dst + n2;
|
||||
|
||||
|
||||
for( i = 0; i < n2; i += 2, itab += tab_step*2 )
|
||||
{
|
||||
j = itab[0];
|
||||
@@ -647,7 +647,7 @@ DFT( const Complex<T>* src, Complex<T>* dst, int n,
|
||||
DFT_VecR4<T> vr4;
|
||||
n = vr4(dst, factors[0], n0, dw0, wave);
|
||||
}
|
||||
|
||||
|
||||
// radix-4 transform
|
||||
for( ; n*4 <= factors[0]; )
|
||||
{
|
||||
@@ -671,7 +671,7 @@ DFT( const Complex<T>* src, Complex<T>* dst, int n,
|
||||
|
||||
r2 = v0[0].re; i2 = v0[0].im;
|
||||
r4 = v0[nx].re; i4 = v0[nx].im;
|
||||
|
||||
|
||||
r0 = r2 + r4; i0 = i2 + i4;
|
||||
r2 -= r4; i2 -= i4;
|
||||
|
||||
@@ -772,7 +772,7 @@ DFT( const Complex<T>* src, Complex<T>* dst, int n,
|
||||
i2 = v[nx*2].re*wave[dw*2].re - v[nx*2].im*wave[dw*2].im;
|
||||
r2 = v[nx*2].re*wave[dw*2].im + v[nx*2].im*wave[dw*2].re;
|
||||
r1 = r0 + i2; i1 = i0 + r2;
|
||||
|
||||
|
||||
r2 = sin_120*(i0 - r2); i2 = sin_120*(i2 - r0);
|
||||
r0 = v[0].re; i0 = v[0].im;
|
||||
v[0].re = r0 + r1; v[0].im = i0 + i1;
|
||||
@@ -825,7 +825,7 @@ DFT( const Complex<T>* src, Complex<T>* dst, int n,
|
||||
|
||||
r5 = r2 + i3; i5 = i2 + r3;
|
||||
r2 -= i4; i2 -= r4;
|
||||
|
||||
|
||||
r3 = r0 + r1; i3 = i0 + i1;
|
||||
r0 -= r1; i0 -= i1;
|
||||
|
||||
@@ -879,7 +879,7 @@ DFT( const Complex<T>* src, Complex<T>* dst, int n,
|
||||
|
||||
T r1 = v[n-k].re*wave_[-d].re - v[n-k].im*wave_[-d].im;
|
||||
T i1 = v[n-k].re*wave_[-d].im + v[n-k].im*wave_[-d].re;
|
||||
|
||||
|
||||
T r0 = r2 + r1;
|
||||
T i0 = i2 - i1;
|
||||
r1 = r2 - r1;
|
||||
@@ -904,7 +904,7 @@ DFT( const Complex<T>* src, Complex<T>* dst, int n,
|
||||
T i0 = wave[d].im * a[q].im;
|
||||
T r1 = wave[d].re * b[q].im;
|
||||
T i1 = wave[d].im * b[q].re;
|
||||
|
||||
|
||||
s1.re += r0 + i0; s0.re += r0 - i0;
|
||||
s1.im += r1 - i1; s0.im += r1 + i1;
|
||||
|
||||
@@ -1416,7 +1416,7 @@ static void DFT_32f( const Complexf* src, Complexf* dst, int n,
|
||||
int flags, double scale )
|
||||
{
|
||||
DFT(src, dst, n, nf, factors, itab, wave, tab_size, spec, buf, flags, scale);
|
||||
}
|
||||
}
|
||||
|
||||
static void DFT_64f( const Complexd* src, Complexd* dst, int n,
|
||||
int nf, const int* factors, const int* itab,
|
||||
@@ -1455,9 +1455,9 @@ static void CCSIDFT_64f( const double* src, double* dst, int n, int nf, int* fac
|
||||
{
|
||||
CCSIDFT( src, dst, n, nf, factors, itab, wave, tab_size, spec, buf, flags, scale);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
{
|
||||
@@ -1473,7 +1473,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
|
||||
AutoBuffer<uchar> buf;
|
||||
void *spec = 0;
|
||||
|
||||
|
||||
Mat src0 = _src0.getMat(), src = src0;
|
||||
int prev_len = 0, stage = 0;
|
||||
bool inv = (flags & DFT_INVERSE) != 0;
|
||||
@@ -1495,7 +1495,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
_dst.create( src.size(), depth );
|
||||
else
|
||||
_dst.create( src.size(), type );
|
||||
|
||||
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
if( !real_transform )
|
||||
@@ -1546,7 +1546,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
if( len*count >= 64 ) // use IPP DFT if available
|
||||
{
|
||||
int ipp_sz = 0;
|
||||
|
||||
|
||||
if( real_transform && stage == 0 )
|
||||
{
|
||||
if( depth == CV_32F )
|
||||
@@ -1667,7 +1667,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
|
||||
if( tmp_buf )
|
||||
dptr = tmp_buf;
|
||||
|
||||
|
||||
dft_func( sptr, dptr, len, nf, factors, itab, wave, len, spec, ptr, _flags, scale );
|
||||
if( dptr != dptr0 )
|
||||
memcpy( dptr0, dptr + dptr_offset, dst_full_len );
|
||||
@@ -1694,7 +1694,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
buf1 = ptr;
|
||||
ptr += len*complex_elem_size;
|
||||
dbuf0 = buf0, dbuf1 = buf1;
|
||||
|
||||
|
||||
if( use_buf )
|
||||
{
|
||||
dbuf1 = ptr;
|
||||
@@ -1749,7 +1749,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
}
|
||||
sptr0 += complex_elem_size;
|
||||
}
|
||||
|
||||
|
||||
if( even )
|
||||
dft_func( buf1, dbuf1, len, nf, factors, itab,
|
||||
wave, len, spec, ptr, inv, scale );
|
||||
@@ -1832,7 +1832,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
{
|
||||
float* p = p0 + dstep*i;
|
||||
float* q = i == 0 || i*2 == len ? p : p0 + dstep*(len-i);
|
||||
|
||||
|
||||
for( int j = 1; j < (n+1)/2; j++ )
|
||||
{
|
||||
p[(n-j)*2] = q[j*2];
|
||||
@@ -1848,7 +1848,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
{
|
||||
double* p = p0 + dstep*i;
|
||||
double* q = i == 0 || i*2 == len ? p : p0 + dstep*(len-i);
|
||||
|
||||
|
||||
for( int j = 1; j < (n+1)/2; j++ )
|
||||
{
|
||||
p[(n-j)*2] = q[j*2];
|
||||
@@ -1901,7 +1901,7 @@ void cv::mulSpectrums( InputArray _srcA, InputArray _srcB,
|
||||
|
||||
_dst.create( srcA.rows, srcA.cols, type );
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
|
||||
bool is_1d = (flags & DFT_ROWS) || (rows == 1 || (cols == 1 &&
|
||||
srcA.isContinuous() && srcB.isContinuous() && dst.isContinuous()));
|
||||
|
||||
@@ -2163,7 +2163,7 @@ DCTInit( int n, int elem_size, void* _wave, int inv )
|
||||
int i;
|
||||
Complex<double> w, w1;
|
||||
double t, scale;
|
||||
|
||||
|
||||
if( n == 1 )
|
||||
return;
|
||||
|
||||
@@ -2186,7 +2186,7 @@ DCTInit( int n, int elem_size, void* _wave, int inv )
|
||||
w1.re = std::sqrt(1. - w1.im*w1.im);
|
||||
}
|
||||
n >>= 1;
|
||||
|
||||
|
||||
if( elem_size == sizeof(Complex<double>) )
|
||||
{
|
||||
Complex<double>* wave = (Complex<double>*)_wave;
|
||||
@@ -2206,7 +2206,7 @@ DCTInit( int n, int elem_size, void* _wave, int inv )
|
||||
{
|
||||
Complex<float>* wave = (Complex<float>*)_wave;
|
||||
assert( elem_size == sizeof(Complex<float>) );
|
||||
|
||||
|
||||
w.re = (float)scale;
|
||||
w.im = 0.f;
|
||||
|
||||
@@ -2257,10 +2257,10 @@ static void IDCT_64f(const double* src, int src_step, double* dft_src, double* d
|
||||
{
|
||||
IDCT(src, src_step, dft_src, dft_dst, dst, dst_step,
|
||||
n, nf, factors, itab, dft_wave, dct_wave, spec, buf);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void cv::dct( InputArray _src0, OutputArray _dst, int flags )
|
||||
{
|
||||
static DCTFunc dct_tbl[4] =
|
||||
@@ -2308,7 +2308,7 @@ void cv::dct( InputArray _src0, OutputArray _dst, int flags )
|
||||
{
|
||||
uchar *sptr = src.data, *dptr = dst.data;
|
||||
size_t sstep0, sstep1, dstep0, dstep1;
|
||||
|
||||
|
||||
if( stage == 0 )
|
||||
{
|
||||
len = src.cols;
|
||||
@@ -2389,7 +2389,7 @@ void cv::dct( InputArray _src0, OutputArray _dst, int flags )
|
||||
ptr = (uchar*)cvAlignPtr( ptr + len*sizeof(int), 16 );
|
||||
DFTInit( len, nf, factors, itab, complex_elem_size, dft_wave, inv );
|
||||
}
|
||||
|
||||
|
||||
dct_wave = ptr;
|
||||
ptr += (len/2 + 1)*complex_elem_size;
|
||||
src_dft_buf = dst_dft_buf = ptr;
|
||||
@@ -2425,188 +2425,188 @@ namespace cv
|
||||
{
|
||||
|
||||
static const int optimalDFTSizeTab[] = {
|
||||
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, 40, 45, 48,
|
||||
50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100, 108, 120, 125, 128, 135, 144, 150, 160,
|
||||
162, 180, 192, 200, 216, 225, 240, 243, 250, 256, 270, 288, 300, 320, 324, 360, 375,
|
||||
384, 400, 405, 432, 450, 480, 486, 500, 512, 540, 576, 600, 625, 640, 648, 675, 720,
|
||||
729, 750, 768, 800, 810, 864, 900, 960, 972, 1000, 1024, 1080, 1125, 1152, 1200,
|
||||
1215, 1250, 1280, 1296, 1350, 1440, 1458, 1500, 1536, 1600, 1620, 1728, 1800, 1875,
|
||||
1920, 1944, 2000, 2025, 2048, 2160, 2187, 2250, 2304, 2400, 2430, 2500, 2560, 2592,
|
||||
2700, 2880, 2916, 3000, 3072, 3125, 3200, 3240, 3375, 3456, 3600, 3645, 3750, 3840,
|
||||
3888, 4000, 4050, 4096, 4320, 4374, 4500, 4608, 4800, 4860, 5000, 5120, 5184, 5400,
|
||||
5625, 5760, 5832, 6000, 6075, 6144, 6250, 6400, 6480, 6561, 6750, 6912, 7200, 7290,
|
||||
7500, 7680, 7776, 8000, 8100, 8192, 8640, 8748, 9000, 9216, 9375, 9600, 9720, 10000,
|
||||
10125, 10240, 10368, 10800, 10935, 11250, 11520, 11664, 12000, 12150, 12288, 12500,
|
||||
12800, 12960, 13122, 13500, 13824, 14400, 14580, 15000, 15360, 15552, 15625, 16000,
|
||||
16200, 16384, 16875, 17280, 17496, 18000, 18225, 18432, 18750, 19200, 19440, 19683,
|
||||
20000, 20250, 20480, 20736, 21600, 21870, 22500, 23040, 23328, 24000, 24300, 24576,
|
||||
25000, 25600, 25920, 26244, 27000, 27648, 28125, 28800, 29160, 30000, 30375, 30720,
|
||||
31104, 31250, 32000, 32400, 32768, 32805, 33750, 34560, 34992, 36000, 36450, 36864,
|
||||
37500, 38400, 38880, 39366, 40000, 40500, 40960, 41472, 43200, 43740, 45000, 46080,
|
||||
46656, 46875, 48000, 48600, 49152, 50000, 50625, 51200, 51840, 52488, 54000, 54675,
|
||||
55296, 56250, 57600, 58320, 59049, 60000, 60750, 61440, 62208, 62500, 64000, 64800,
|
||||
65536, 65610, 67500, 69120, 69984, 72000, 72900, 73728, 75000, 76800, 77760, 78125,
|
||||
78732, 80000, 81000, 81920, 82944, 84375, 86400, 87480, 90000, 91125, 92160, 93312,
|
||||
93750, 96000, 97200, 98304, 98415, 100000, 101250, 102400, 103680, 104976, 108000,
|
||||
109350, 110592, 112500, 115200, 116640, 118098, 120000, 121500, 122880, 124416, 125000,
|
||||
128000, 129600, 131072, 131220, 135000, 138240, 139968, 140625, 144000, 145800, 147456,
|
||||
150000, 151875, 153600, 155520, 156250, 157464, 160000, 162000, 163840, 164025, 165888,
|
||||
168750, 172800, 174960, 177147, 180000, 182250, 184320, 186624, 187500, 192000, 194400,
|
||||
196608, 196830, 200000, 202500, 204800, 207360, 209952, 216000, 218700, 221184, 225000,
|
||||
230400, 233280, 234375, 236196, 240000, 243000, 245760, 248832, 250000, 253125, 256000,
|
||||
259200, 262144, 262440, 270000, 273375, 276480, 279936, 281250, 288000, 291600, 294912,
|
||||
295245, 300000, 303750, 307200, 311040, 312500, 314928, 320000, 324000, 327680, 328050,
|
||||
331776, 337500, 345600, 349920, 354294, 360000, 364500, 368640, 373248, 375000, 384000,
|
||||
388800, 390625, 393216, 393660, 400000, 405000, 409600, 414720, 419904, 421875, 432000,
|
||||
437400, 442368, 450000, 455625, 460800, 466560, 468750, 472392, 480000, 486000, 491520,
|
||||
492075, 497664, 500000, 506250, 512000, 518400, 524288, 524880, 531441, 540000, 546750,
|
||||
552960, 559872, 562500, 576000, 583200, 589824, 590490, 600000, 607500, 614400, 622080,
|
||||
625000, 629856, 640000, 648000, 655360, 656100, 663552, 675000, 691200, 699840, 703125,
|
||||
708588, 720000, 729000, 737280, 746496, 750000, 759375, 768000, 777600, 781250, 786432,
|
||||
787320, 800000, 810000, 819200, 820125, 829440, 839808, 843750, 864000, 874800, 884736,
|
||||
885735, 900000, 911250, 921600, 933120, 937500, 944784, 960000, 972000, 983040, 984150,
|
||||
995328, 1000000, 1012500, 1024000, 1036800, 1048576, 1049760, 1062882, 1080000, 1093500,
|
||||
1105920, 1119744, 1125000, 1152000, 1166400, 1171875, 1179648, 1180980, 1200000,
|
||||
1215000, 1228800, 1244160, 1250000, 1259712, 1265625, 1280000, 1296000, 1310720,
|
||||
1312200, 1327104, 1350000, 1366875, 1382400, 1399680, 1406250, 1417176, 1440000,
|
||||
1458000, 1474560, 1476225, 1492992, 1500000, 1518750, 1536000, 1555200, 1562500,
|
||||
1572864, 1574640, 1594323, 1600000, 1620000, 1638400, 1640250, 1658880, 1679616,
|
||||
1687500, 1728000, 1749600, 1769472, 1771470, 1800000, 1822500, 1843200, 1866240,
|
||||
1875000, 1889568, 1920000, 1944000, 1953125, 1966080, 1968300, 1990656, 2000000,
|
||||
2025000, 2048000, 2073600, 2097152, 2099520, 2109375, 2125764, 2160000, 2187000,
|
||||
2211840, 2239488, 2250000, 2278125, 2304000, 2332800, 2343750, 2359296, 2361960,
|
||||
2400000, 2430000, 2457600, 2460375, 2488320, 2500000, 2519424, 2531250, 2560000,
|
||||
2592000, 2621440, 2624400, 2654208, 2657205, 2700000, 2733750, 2764800, 2799360,
|
||||
2812500, 2834352, 2880000, 2916000, 2949120, 2952450, 2985984, 3000000, 3037500,
|
||||
3072000, 3110400, 3125000, 3145728, 3149280, 3188646, 3200000, 3240000, 3276800,
|
||||
3280500, 3317760, 3359232, 3375000, 3456000, 3499200, 3515625, 3538944, 3542940,
|
||||
3600000, 3645000, 3686400, 3732480, 3750000, 3779136, 3796875, 3840000, 3888000,
|
||||
3906250, 3932160, 3936600, 3981312, 4000000, 4050000, 4096000, 4100625, 4147200,
|
||||
4194304, 4199040, 4218750, 4251528, 4320000, 4374000, 4423680, 4428675, 4478976,
|
||||
4500000, 4556250, 4608000, 4665600, 4687500, 4718592, 4723920, 4782969, 4800000,
|
||||
4860000, 4915200, 4920750, 4976640, 5000000, 5038848, 5062500, 5120000, 5184000,
|
||||
5242880, 5248800, 5308416, 5314410, 5400000, 5467500, 5529600, 5598720, 5625000,
|
||||
5668704, 5760000, 5832000, 5859375, 5898240, 5904900, 5971968, 6000000, 6075000,
|
||||
6144000, 6220800, 6250000, 6291456, 6298560, 6328125, 6377292, 6400000, 6480000,
|
||||
6553600, 6561000, 6635520, 6718464, 6750000, 6834375, 6912000, 6998400, 7031250,
|
||||
7077888, 7085880, 7200000, 7290000, 7372800, 7381125, 7464960, 7500000, 7558272,
|
||||
7593750, 7680000, 7776000, 7812500, 7864320, 7873200, 7962624, 7971615, 8000000,
|
||||
8100000, 8192000, 8201250, 8294400, 8388608, 8398080, 8437500, 8503056, 8640000,
|
||||
8748000, 8847360, 8857350, 8957952, 9000000, 9112500, 9216000, 9331200, 9375000,
|
||||
9437184, 9447840, 9565938, 9600000, 9720000, 9765625, 9830400, 9841500, 9953280,
|
||||
10000000, 10077696, 10125000, 10240000, 10368000, 10485760, 10497600, 10546875, 10616832,
|
||||
10628820, 10800000, 10935000, 11059200, 11197440, 11250000, 11337408, 11390625, 11520000,
|
||||
11664000, 11718750, 11796480, 11809800, 11943936, 12000000, 12150000, 12288000, 12301875,
|
||||
12441600, 12500000, 12582912, 12597120, 12656250, 12754584, 12800000, 12960000, 13107200,
|
||||
13122000, 13271040, 13286025, 13436928, 13500000, 13668750, 13824000, 13996800, 14062500,
|
||||
14155776, 14171760, 14400000, 14580000, 14745600, 14762250, 14929920, 15000000, 15116544,
|
||||
15187500, 15360000, 15552000, 15625000, 15728640, 15746400, 15925248, 15943230, 16000000,
|
||||
16200000, 16384000, 16402500, 16588800, 16777216, 16796160, 16875000, 17006112, 17280000,
|
||||
17496000, 17578125, 17694720, 17714700, 17915904, 18000000, 18225000, 18432000, 18662400,
|
||||
18750000, 18874368, 18895680, 18984375, 19131876, 19200000, 19440000, 19531250, 19660800,
|
||||
19683000, 19906560, 20000000, 20155392, 20250000, 20480000, 20503125, 20736000, 20971520,
|
||||
20995200, 21093750, 21233664, 21257640, 21600000, 21870000, 22118400, 22143375, 22394880,
|
||||
22500000, 22674816, 22781250, 23040000, 23328000, 23437500, 23592960, 23619600, 23887872,
|
||||
23914845, 24000000, 24300000, 24576000, 24603750, 24883200, 25000000, 25165824, 25194240,
|
||||
25312500, 25509168, 25600000, 25920000, 26214400, 26244000, 26542080, 26572050, 26873856,
|
||||
27000000, 27337500, 27648000, 27993600, 28125000, 28311552, 28343520, 28800000, 29160000,
|
||||
29296875, 29491200, 29524500, 29859840, 30000000, 30233088, 30375000, 30720000, 31104000,
|
||||
31250000, 31457280, 31492800, 31640625, 31850496, 31886460, 32000000, 32400000, 32768000,
|
||||
32805000, 33177600, 33554432, 33592320, 33750000, 34012224, 34171875, 34560000, 34992000,
|
||||
35156250, 35389440, 35429400, 35831808, 36000000, 36450000, 36864000, 36905625, 37324800,
|
||||
37500000, 37748736, 37791360, 37968750, 38263752, 38400000, 38880000, 39062500, 39321600,
|
||||
39366000, 39813120, 39858075, 40000000, 40310784, 40500000, 40960000, 41006250, 41472000,
|
||||
41943040, 41990400, 42187500, 42467328, 42515280, 43200000, 43740000, 44236800, 44286750,
|
||||
44789760, 45000000, 45349632, 45562500, 46080000, 46656000, 46875000, 47185920, 47239200,
|
||||
47775744, 47829690, 48000000, 48600000, 48828125, 49152000, 49207500, 49766400, 50000000,
|
||||
50331648, 50388480, 50625000, 51018336, 51200000, 51840000, 52428800, 52488000, 52734375,
|
||||
53084160, 53144100, 53747712, 54000000, 54675000, 55296000, 55987200, 56250000, 56623104,
|
||||
56687040, 56953125, 57600000, 58320000, 58593750, 58982400, 59049000, 59719680, 60000000,
|
||||
60466176, 60750000, 61440000, 61509375, 62208000, 62500000, 62914560, 62985600, 63281250,
|
||||
63700992, 63772920, 64000000, 64800000, 65536000, 65610000, 66355200, 66430125, 67108864,
|
||||
67184640, 67500000, 68024448, 68343750, 69120000, 69984000, 70312500, 70778880, 70858800,
|
||||
71663616, 72000000, 72900000, 73728000, 73811250, 74649600, 75000000, 75497472, 75582720,
|
||||
75937500, 76527504, 76800000, 77760000, 78125000, 78643200, 78732000, 79626240, 79716150,
|
||||
80000000, 80621568, 81000000, 81920000, 82012500, 82944000, 83886080, 83980800, 84375000,
|
||||
84934656, 85030560, 86400000, 87480000, 87890625, 88473600, 88573500, 89579520, 90000000,
|
||||
90699264, 91125000, 92160000, 93312000, 93750000, 94371840, 94478400, 94921875, 95551488,
|
||||
95659380, 96000000, 97200000, 97656250, 98304000, 98415000, 99532800, 100000000,
|
||||
100663296, 100776960, 101250000, 102036672, 102400000, 102515625, 103680000, 104857600,
|
||||
104976000, 105468750, 106168320, 106288200, 107495424, 108000000, 109350000, 110592000,
|
||||
110716875, 111974400, 112500000, 113246208, 113374080, 113906250, 115200000, 116640000,
|
||||
117187500, 117964800, 118098000, 119439360, 119574225, 120000000, 120932352, 121500000,
|
||||
122880000, 123018750, 124416000, 125000000, 125829120, 125971200, 126562500, 127401984,
|
||||
127545840, 128000000, 129600000, 131072000, 131220000, 132710400, 132860250, 134217728,
|
||||
134369280, 135000000, 136048896, 136687500, 138240000, 139968000, 140625000, 141557760,
|
||||
141717600, 143327232, 144000000, 145800000, 146484375, 147456000, 147622500, 149299200,
|
||||
150000000, 150994944, 151165440, 151875000, 153055008, 153600000, 155520000, 156250000,
|
||||
157286400, 157464000, 158203125, 159252480, 159432300, 160000000, 161243136, 162000000,
|
||||
163840000, 164025000, 165888000, 167772160, 167961600, 168750000, 169869312, 170061120,
|
||||
170859375, 172800000, 174960000, 175781250, 176947200, 177147000, 179159040, 180000000,
|
||||
181398528, 182250000, 184320000, 184528125, 186624000, 187500000, 188743680, 188956800,
|
||||
189843750, 191102976, 191318760, 192000000, 194400000, 195312500, 196608000, 196830000,
|
||||
199065600, 199290375, 200000000, 201326592, 201553920, 202500000, 204073344, 204800000,
|
||||
205031250, 207360000, 209715200, 209952000, 210937500, 212336640, 212576400, 214990848,
|
||||
216000000, 218700000, 221184000, 221433750, 223948800, 225000000, 226492416, 226748160,
|
||||
227812500, 230400000, 233280000, 234375000, 235929600, 236196000, 238878720, 239148450,
|
||||
240000000, 241864704, 243000000, 244140625, 245760000, 246037500, 248832000, 250000000,
|
||||
251658240, 251942400, 253125000, 254803968, 255091680, 256000000, 259200000, 262144000,
|
||||
262440000, 263671875, 265420800, 265720500, 268435456, 268738560, 270000000, 272097792,
|
||||
273375000, 276480000, 279936000, 281250000, 283115520, 283435200, 284765625, 286654464,
|
||||
288000000, 291600000, 292968750, 294912000, 295245000, 298598400, 300000000, 301989888,
|
||||
302330880, 303750000, 306110016, 307200000, 307546875, 311040000, 312500000, 314572800,
|
||||
314928000, 316406250, 318504960, 318864600, 320000000, 322486272, 324000000, 327680000,
|
||||
328050000, 331776000, 332150625, 335544320, 335923200, 337500000, 339738624, 340122240,
|
||||
341718750, 345600000, 349920000, 351562500, 353894400, 354294000, 358318080, 360000000,
|
||||
362797056, 364500000, 368640000, 369056250, 373248000, 375000000, 377487360, 377913600,
|
||||
379687500, 382205952, 382637520, 384000000, 388800000, 390625000, 393216000, 393660000,
|
||||
398131200, 398580750, 400000000, 402653184, 403107840, 405000000, 408146688, 409600000,
|
||||
410062500, 414720000, 419430400, 419904000, 421875000, 424673280, 425152800, 429981696,
|
||||
432000000, 437400000, 439453125, 442368000, 442867500, 447897600, 450000000, 452984832,
|
||||
453496320, 455625000, 460800000, 466560000, 468750000, 471859200, 472392000, 474609375,
|
||||
477757440, 478296900, 480000000, 483729408, 486000000, 488281250, 491520000, 492075000,
|
||||
497664000, 500000000, 503316480, 503884800, 506250000, 509607936, 510183360, 512000000,
|
||||
512578125, 518400000, 524288000, 524880000, 527343750, 530841600, 531441000, 536870912,
|
||||
537477120, 540000000, 544195584, 546750000, 552960000, 553584375, 559872000, 562500000,
|
||||
566231040, 566870400, 569531250, 573308928, 576000000, 583200000, 585937500, 589824000,
|
||||
590490000, 597196800, 597871125, 600000000, 603979776, 604661760, 607500000, 612220032,
|
||||
614400000, 615093750, 622080000, 625000000, 629145600, 629856000, 632812500, 637009920,
|
||||
637729200, 640000000, 644972544, 648000000, 655360000, 656100000, 663552000, 664301250,
|
||||
671088640, 671846400, 675000000, 679477248, 680244480, 683437500, 691200000, 699840000,
|
||||
703125000, 707788800, 708588000, 716636160, 720000000, 725594112, 729000000, 732421875,
|
||||
737280000, 738112500, 746496000, 750000000, 754974720, 755827200, 759375000, 764411904,
|
||||
765275040, 768000000, 777600000, 781250000, 786432000, 787320000, 791015625, 796262400,
|
||||
797161500, 800000000, 805306368, 806215680, 810000000, 816293376, 819200000, 820125000,
|
||||
829440000, 838860800, 839808000, 843750000, 849346560, 850305600, 854296875, 859963392,
|
||||
864000000, 874800000, 878906250, 884736000, 885735000, 895795200, 900000000, 905969664,
|
||||
906992640, 911250000, 921600000, 922640625, 933120000, 937500000, 943718400, 944784000,
|
||||
949218750, 955514880, 956593800, 960000000, 967458816, 972000000, 976562500, 983040000,
|
||||
984150000, 995328000, 996451875, 1000000000, 1006632960, 1007769600, 1012500000,
|
||||
1019215872, 1020366720, 1024000000, 1025156250, 1036800000, 1048576000, 1049760000,
|
||||
1054687500, 1061683200, 1062882000, 1073741824, 1074954240, 1080000000, 1088391168,
|
||||
1093500000, 1105920000, 1107168750, 1119744000, 1125000000, 1132462080, 1133740800,
|
||||
1139062500, 1146617856, 1152000000, 1166400000, 1171875000, 1179648000, 1180980000,
|
||||
1194393600, 1195742250, 1200000000, 1207959552, 1209323520, 1215000000, 1220703125,
|
||||
1224440064, 1228800000, 1230187500, 1244160000, 1250000000, 1258291200, 1259712000,
|
||||
1265625000, 1274019840, 1275458400, 1280000000, 1289945088, 1296000000, 1310720000,
|
||||
1312200000, 1318359375, 1327104000, 1328602500, 1342177280, 1343692800, 1350000000,
|
||||
1358954496, 1360488960, 1366875000, 1382400000, 1399680000, 1406250000, 1415577600,
|
||||
1417176000, 1423828125, 1433272320, 1440000000, 1451188224, 1458000000, 1464843750,
|
||||
1474560000, 1476225000, 1492992000, 1500000000, 1509949440, 1511654400, 1518750000,
|
||||
1528823808, 1530550080, 1536000000, 1537734375, 1555200000, 1562500000, 1572864000,
|
||||
1574640000, 1582031250, 1592524800, 1594323000, 1600000000, 1610612736, 1612431360,
|
||||
1620000000, 1632586752, 1638400000, 1640250000, 1658880000, 1660753125, 1677721600,
|
||||
1679616000, 1687500000, 1698693120, 1700611200, 1708593750, 1719926784, 1728000000,
|
||||
1749600000, 1757812500, 1769472000, 1771470000, 1791590400, 1800000000, 1811939328,
|
||||
1813985280, 1822500000, 1843200000, 1845281250, 1866240000, 1875000000, 1887436800,
|
||||
1889568000, 1898437500, 1911029760, 1913187600, 1920000000, 1934917632, 1944000000,
|
||||
1953125000, 1966080000, 1968300000, 1990656000, 1992903750, 2000000000, 2013265920,
|
||||
2015539200, 2025000000, 2038431744, 2040733440, 2048000000, 2050312500, 2073600000,
|
||||
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, 40, 45, 48,
|
||||
50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100, 108, 120, 125, 128, 135, 144, 150, 160,
|
||||
162, 180, 192, 200, 216, 225, 240, 243, 250, 256, 270, 288, 300, 320, 324, 360, 375,
|
||||
384, 400, 405, 432, 450, 480, 486, 500, 512, 540, 576, 600, 625, 640, 648, 675, 720,
|
||||
729, 750, 768, 800, 810, 864, 900, 960, 972, 1000, 1024, 1080, 1125, 1152, 1200,
|
||||
1215, 1250, 1280, 1296, 1350, 1440, 1458, 1500, 1536, 1600, 1620, 1728, 1800, 1875,
|
||||
1920, 1944, 2000, 2025, 2048, 2160, 2187, 2250, 2304, 2400, 2430, 2500, 2560, 2592,
|
||||
2700, 2880, 2916, 3000, 3072, 3125, 3200, 3240, 3375, 3456, 3600, 3645, 3750, 3840,
|
||||
3888, 4000, 4050, 4096, 4320, 4374, 4500, 4608, 4800, 4860, 5000, 5120, 5184, 5400,
|
||||
5625, 5760, 5832, 6000, 6075, 6144, 6250, 6400, 6480, 6561, 6750, 6912, 7200, 7290,
|
||||
7500, 7680, 7776, 8000, 8100, 8192, 8640, 8748, 9000, 9216, 9375, 9600, 9720, 10000,
|
||||
10125, 10240, 10368, 10800, 10935, 11250, 11520, 11664, 12000, 12150, 12288, 12500,
|
||||
12800, 12960, 13122, 13500, 13824, 14400, 14580, 15000, 15360, 15552, 15625, 16000,
|
||||
16200, 16384, 16875, 17280, 17496, 18000, 18225, 18432, 18750, 19200, 19440, 19683,
|
||||
20000, 20250, 20480, 20736, 21600, 21870, 22500, 23040, 23328, 24000, 24300, 24576,
|
||||
25000, 25600, 25920, 26244, 27000, 27648, 28125, 28800, 29160, 30000, 30375, 30720,
|
||||
31104, 31250, 32000, 32400, 32768, 32805, 33750, 34560, 34992, 36000, 36450, 36864,
|
||||
37500, 38400, 38880, 39366, 40000, 40500, 40960, 41472, 43200, 43740, 45000, 46080,
|
||||
46656, 46875, 48000, 48600, 49152, 50000, 50625, 51200, 51840, 52488, 54000, 54675,
|
||||
55296, 56250, 57600, 58320, 59049, 60000, 60750, 61440, 62208, 62500, 64000, 64800,
|
||||
65536, 65610, 67500, 69120, 69984, 72000, 72900, 73728, 75000, 76800, 77760, 78125,
|
||||
78732, 80000, 81000, 81920, 82944, 84375, 86400, 87480, 90000, 91125, 92160, 93312,
|
||||
93750, 96000, 97200, 98304, 98415, 100000, 101250, 102400, 103680, 104976, 108000,
|
||||
109350, 110592, 112500, 115200, 116640, 118098, 120000, 121500, 122880, 124416, 125000,
|
||||
128000, 129600, 131072, 131220, 135000, 138240, 139968, 140625, 144000, 145800, 147456,
|
||||
150000, 151875, 153600, 155520, 156250, 157464, 160000, 162000, 163840, 164025, 165888,
|
||||
168750, 172800, 174960, 177147, 180000, 182250, 184320, 186624, 187500, 192000, 194400,
|
||||
196608, 196830, 200000, 202500, 204800, 207360, 209952, 216000, 218700, 221184, 225000,
|
||||
230400, 233280, 234375, 236196, 240000, 243000, 245760, 248832, 250000, 253125, 256000,
|
||||
259200, 262144, 262440, 270000, 273375, 276480, 279936, 281250, 288000, 291600, 294912,
|
||||
295245, 300000, 303750, 307200, 311040, 312500, 314928, 320000, 324000, 327680, 328050,
|
||||
331776, 337500, 345600, 349920, 354294, 360000, 364500, 368640, 373248, 375000, 384000,
|
||||
388800, 390625, 393216, 393660, 400000, 405000, 409600, 414720, 419904, 421875, 432000,
|
||||
437400, 442368, 450000, 455625, 460800, 466560, 468750, 472392, 480000, 486000, 491520,
|
||||
492075, 497664, 500000, 506250, 512000, 518400, 524288, 524880, 531441, 540000, 546750,
|
||||
552960, 559872, 562500, 576000, 583200, 589824, 590490, 600000, 607500, 614400, 622080,
|
||||
625000, 629856, 640000, 648000, 655360, 656100, 663552, 675000, 691200, 699840, 703125,
|
||||
708588, 720000, 729000, 737280, 746496, 750000, 759375, 768000, 777600, 781250, 786432,
|
||||
787320, 800000, 810000, 819200, 820125, 829440, 839808, 843750, 864000, 874800, 884736,
|
||||
885735, 900000, 911250, 921600, 933120, 937500, 944784, 960000, 972000, 983040, 984150,
|
||||
995328, 1000000, 1012500, 1024000, 1036800, 1048576, 1049760, 1062882, 1080000, 1093500,
|
||||
1105920, 1119744, 1125000, 1152000, 1166400, 1171875, 1179648, 1180980, 1200000,
|
||||
1215000, 1228800, 1244160, 1250000, 1259712, 1265625, 1280000, 1296000, 1310720,
|
||||
1312200, 1327104, 1350000, 1366875, 1382400, 1399680, 1406250, 1417176, 1440000,
|
||||
1458000, 1474560, 1476225, 1492992, 1500000, 1518750, 1536000, 1555200, 1562500,
|
||||
1572864, 1574640, 1594323, 1600000, 1620000, 1638400, 1640250, 1658880, 1679616,
|
||||
1687500, 1728000, 1749600, 1769472, 1771470, 1800000, 1822500, 1843200, 1866240,
|
||||
1875000, 1889568, 1920000, 1944000, 1953125, 1966080, 1968300, 1990656, 2000000,
|
||||
2025000, 2048000, 2073600, 2097152, 2099520, 2109375, 2125764, 2160000, 2187000,
|
||||
2211840, 2239488, 2250000, 2278125, 2304000, 2332800, 2343750, 2359296, 2361960,
|
||||
2400000, 2430000, 2457600, 2460375, 2488320, 2500000, 2519424, 2531250, 2560000,
|
||||
2592000, 2621440, 2624400, 2654208, 2657205, 2700000, 2733750, 2764800, 2799360,
|
||||
2812500, 2834352, 2880000, 2916000, 2949120, 2952450, 2985984, 3000000, 3037500,
|
||||
3072000, 3110400, 3125000, 3145728, 3149280, 3188646, 3200000, 3240000, 3276800,
|
||||
3280500, 3317760, 3359232, 3375000, 3456000, 3499200, 3515625, 3538944, 3542940,
|
||||
3600000, 3645000, 3686400, 3732480, 3750000, 3779136, 3796875, 3840000, 3888000,
|
||||
3906250, 3932160, 3936600, 3981312, 4000000, 4050000, 4096000, 4100625, 4147200,
|
||||
4194304, 4199040, 4218750, 4251528, 4320000, 4374000, 4423680, 4428675, 4478976,
|
||||
4500000, 4556250, 4608000, 4665600, 4687500, 4718592, 4723920, 4782969, 4800000,
|
||||
4860000, 4915200, 4920750, 4976640, 5000000, 5038848, 5062500, 5120000, 5184000,
|
||||
5242880, 5248800, 5308416, 5314410, 5400000, 5467500, 5529600, 5598720, 5625000,
|
||||
5668704, 5760000, 5832000, 5859375, 5898240, 5904900, 5971968, 6000000, 6075000,
|
||||
6144000, 6220800, 6250000, 6291456, 6298560, 6328125, 6377292, 6400000, 6480000,
|
||||
6553600, 6561000, 6635520, 6718464, 6750000, 6834375, 6912000, 6998400, 7031250,
|
||||
7077888, 7085880, 7200000, 7290000, 7372800, 7381125, 7464960, 7500000, 7558272,
|
||||
7593750, 7680000, 7776000, 7812500, 7864320, 7873200, 7962624, 7971615, 8000000,
|
||||
8100000, 8192000, 8201250, 8294400, 8388608, 8398080, 8437500, 8503056, 8640000,
|
||||
8748000, 8847360, 8857350, 8957952, 9000000, 9112500, 9216000, 9331200, 9375000,
|
||||
9437184, 9447840, 9565938, 9600000, 9720000, 9765625, 9830400, 9841500, 9953280,
|
||||
10000000, 10077696, 10125000, 10240000, 10368000, 10485760, 10497600, 10546875, 10616832,
|
||||
10628820, 10800000, 10935000, 11059200, 11197440, 11250000, 11337408, 11390625, 11520000,
|
||||
11664000, 11718750, 11796480, 11809800, 11943936, 12000000, 12150000, 12288000, 12301875,
|
||||
12441600, 12500000, 12582912, 12597120, 12656250, 12754584, 12800000, 12960000, 13107200,
|
||||
13122000, 13271040, 13286025, 13436928, 13500000, 13668750, 13824000, 13996800, 14062500,
|
||||
14155776, 14171760, 14400000, 14580000, 14745600, 14762250, 14929920, 15000000, 15116544,
|
||||
15187500, 15360000, 15552000, 15625000, 15728640, 15746400, 15925248, 15943230, 16000000,
|
||||
16200000, 16384000, 16402500, 16588800, 16777216, 16796160, 16875000, 17006112, 17280000,
|
||||
17496000, 17578125, 17694720, 17714700, 17915904, 18000000, 18225000, 18432000, 18662400,
|
||||
18750000, 18874368, 18895680, 18984375, 19131876, 19200000, 19440000, 19531250, 19660800,
|
||||
19683000, 19906560, 20000000, 20155392, 20250000, 20480000, 20503125, 20736000, 20971520,
|
||||
20995200, 21093750, 21233664, 21257640, 21600000, 21870000, 22118400, 22143375, 22394880,
|
||||
22500000, 22674816, 22781250, 23040000, 23328000, 23437500, 23592960, 23619600, 23887872,
|
||||
23914845, 24000000, 24300000, 24576000, 24603750, 24883200, 25000000, 25165824, 25194240,
|
||||
25312500, 25509168, 25600000, 25920000, 26214400, 26244000, 26542080, 26572050, 26873856,
|
||||
27000000, 27337500, 27648000, 27993600, 28125000, 28311552, 28343520, 28800000, 29160000,
|
||||
29296875, 29491200, 29524500, 29859840, 30000000, 30233088, 30375000, 30720000, 31104000,
|
||||
31250000, 31457280, 31492800, 31640625, 31850496, 31886460, 32000000, 32400000, 32768000,
|
||||
32805000, 33177600, 33554432, 33592320, 33750000, 34012224, 34171875, 34560000, 34992000,
|
||||
35156250, 35389440, 35429400, 35831808, 36000000, 36450000, 36864000, 36905625, 37324800,
|
||||
37500000, 37748736, 37791360, 37968750, 38263752, 38400000, 38880000, 39062500, 39321600,
|
||||
39366000, 39813120, 39858075, 40000000, 40310784, 40500000, 40960000, 41006250, 41472000,
|
||||
41943040, 41990400, 42187500, 42467328, 42515280, 43200000, 43740000, 44236800, 44286750,
|
||||
44789760, 45000000, 45349632, 45562500, 46080000, 46656000, 46875000, 47185920, 47239200,
|
||||
47775744, 47829690, 48000000, 48600000, 48828125, 49152000, 49207500, 49766400, 50000000,
|
||||
50331648, 50388480, 50625000, 51018336, 51200000, 51840000, 52428800, 52488000, 52734375,
|
||||
53084160, 53144100, 53747712, 54000000, 54675000, 55296000, 55987200, 56250000, 56623104,
|
||||
56687040, 56953125, 57600000, 58320000, 58593750, 58982400, 59049000, 59719680, 60000000,
|
||||
60466176, 60750000, 61440000, 61509375, 62208000, 62500000, 62914560, 62985600, 63281250,
|
||||
63700992, 63772920, 64000000, 64800000, 65536000, 65610000, 66355200, 66430125, 67108864,
|
||||
67184640, 67500000, 68024448, 68343750, 69120000, 69984000, 70312500, 70778880, 70858800,
|
||||
71663616, 72000000, 72900000, 73728000, 73811250, 74649600, 75000000, 75497472, 75582720,
|
||||
75937500, 76527504, 76800000, 77760000, 78125000, 78643200, 78732000, 79626240, 79716150,
|
||||
80000000, 80621568, 81000000, 81920000, 82012500, 82944000, 83886080, 83980800, 84375000,
|
||||
84934656, 85030560, 86400000, 87480000, 87890625, 88473600, 88573500, 89579520, 90000000,
|
||||
90699264, 91125000, 92160000, 93312000, 93750000, 94371840, 94478400, 94921875, 95551488,
|
||||
95659380, 96000000, 97200000, 97656250, 98304000, 98415000, 99532800, 100000000,
|
||||
100663296, 100776960, 101250000, 102036672, 102400000, 102515625, 103680000, 104857600,
|
||||
104976000, 105468750, 106168320, 106288200, 107495424, 108000000, 109350000, 110592000,
|
||||
110716875, 111974400, 112500000, 113246208, 113374080, 113906250, 115200000, 116640000,
|
||||
117187500, 117964800, 118098000, 119439360, 119574225, 120000000, 120932352, 121500000,
|
||||
122880000, 123018750, 124416000, 125000000, 125829120, 125971200, 126562500, 127401984,
|
||||
127545840, 128000000, 129600000, 131072000, 131220000, 132710400, 132860250, 134217728,
|
||||
134369280, 135000000, 136048896, 136687500, 138240000, 139968000, 140625000, 141557760,
|
||||
141717600, 143327232, 144000000, 145800000, 146484375, 147456000, 147622500, 149299200,
|
||||
150000000, 150994944, 151165440, 151875000, 153055008, 153600000, 155520000, 156250000,
|
||||
157286400, 157464000, 158203125, 159252480, 159432300, 160000000, 161243136, 162000000,
|
||||
163840000, 164025000, 165888000, 167772160, 167961600, 168750000, 169869312, 170061120,
|
||||
170859375, 172800000, 174960000, 175781250, 176947200, 177147000, 179159040, 180000000,
|
||||
181398528, 182250000, 184320000, 184528125, 186624000, 187500000, 188743680, 188956800,
|
||||
189843750, 191102976, 191318760, 192000000, 194400000, 195312500, 196608000, 196830000,
|
||||
199065600, 199290375, 200000000, 201326592, 201553920, 202500000, 204073344, 204800000,
|
||||
205031250, 207360000, 209715200, 209952000, 210937500, 212336640, 212576400, 214990848,
|
||||
216000000, 218700000, 221184000, 221433750, 223948800, 225000000, 226492416, 226748160,
|
||||
227812500, 230400000, 233280000, 234375000, 235929600, 236196000, 238878720, 239148450,
|
||||
240000000, 241864704, 243000000, 244140625, 245760000, 246037500, 248832000, 250000000,
|
||||
251658240, 251942400, 253125000, 254803968, 255091680, 256000000, 259200000, 262144000,
|
||||
262440000, 263671875, 265420800, 265720500, 268435456, 268738560, 270000000, 272097792,
|
||||
273375000, 276480000, 279936000, 281250000, 283115520, 283435200, 284765625, 286654464,
|
||||
288000000, 291600000, 292968750, 294912000, 295245000, 298598400, 300000000, 301989888,
|
||||
302330880, 303750000, 306110016, 307200000, 307546875, 311040000, 312500000, 314572800,
|
||||
314928000, 316406250, 318504960, 318864600, 320000000, 322486272, 324000000, 327680000,
|
||||
328050000, 331776000, 332150625, 335544320, 335923200, 337500000, 339738624, 340122240,
|
||||
341718750, 345600000, 349920000, 351562500, 353894400, 354294000, 358318080, 360000000,
|
||||
362797056, 364500000, 368640000, 369056250, 373248000, 375000000, 377487360, 377913600,
|
||||
379687500, 382205952, 382637520, 384000000, 388800000, 390625000, 393216000, 393660000,
|
||||
398131200, 398580750, 400000000, 402653184, 403107840, 405000000, 408146688, 409600000,
|
||||
410062500, 414720000, 419430400, 419904000, 421875000, 424673280, 425152800, 429981696,
|
||||
432000000, 437400000, 439453125, 442368000, 442867500, 447897600, 450000000, 452984832,
|
||||
453496320, 455625000, 460800000, 466560000, 468750000, 471859200, 472392000, 474609375,
|
||||
477757440, 478296900, 480000000, 483729408, 486000000, 488281250, 491520000, 492075000,
|
||||
497664000, 500000000, 503316480, 503884800, 506250000, 509607936, 510183360, 512000000,
|
||||
512578125, 518400000, 524288000, 524880000, 527343750, 530841600, 531441000, 536870912,
|
||||
537477120, 540000000, 544195584, 546750000, 552960000, 553584375, 559872000, 562500000,
|
||||
566231040, 566870400, 569531250, 573308928, 576000000, 583200000, 585937500, 589824000,
|
||||
590490000, 597196800, 597871125, 600000000, 603979776, 604661760, 607500000, 612220032,
|
||||
614400000, 615093750, 622080000, 625000000, 629145600, 629856000, 632812500, 637009920,
|
||||
637729200, 640000000, 644972544, 648000000, 655360000, 656100000, 663552000, 664301250,
|
||||
671088640, 671846400, 675000000, 679477248, 680244480, 683437500, 691200000, 699840000,
|
||||
703125000, 707788800, 708588000, 716636160, 720000000, 725594112, 729000000, 732421875,
|
||||
737280000, 738112500, 746496000, 750000000, 754974720, 755827200, 759375000, 764411904,
|
||||
765275040, 768000000, 777600000, 781250000, 786432000, 787320000, 791015625, 796262400,
|
||||
797161500, 800000000, 805306368, 806215680, 810000000, 816293376, 819200000, 820125000,
|
||||
829440000, 838860800, 839808000, 843750000, 849346560, 850305600, 854296875, 859963392,
|
||||
864000000, 874800000, 878906250, 884736000, 885735000, 895795200, 900000000, 905969664,
|
||||
906992640, 911250000, 921600000, 922640625, 933120000, 937500000, 943718400, 944784000,
|
||||
949218750, 955514880, 956593800, 960000000, 967458816, 972000000, 976562500, 983040000,
|
||||
984150000, 995328000, 996451875, 1000000000, 1006632960, 1007769600, 1012500000,
|
||||
1019215872, 1020366720, 1024000000, 1025156250, 1036800000, 1048576000, 1049760000,
|
||||
1054687500, 1061683200, 1062882000, 1073741824, 1074954240, 1080000000, 1088391168,
|
||||
1093500000, 1105920000, 1107168750, 1119744000, 1125000000, 1132462080, 1133740800,
|
||||
1139062500, 1146617856, 1152000000, 1166400000, 1171875000, 1179648000, 1180980000,
|
||||
1194393600, 1195742250, 1200000000, 1207959552, 1209323520, 1215000000, 1220703125,
|
||||
1224440064, 1228800000, 1230187500, 1244160000, 1250000000, 1258291200, 1259712000,
|
||||
1265625000, 1274019840, 1275458400, 1280000000, 1289945088, 1296000000, 1310720000,
|
||||
1312200000, 1318359375, 1327104000, 1328602500, 1342177280, 1343692800, 1350000000,
|
||||
1358954496, 1360488960, 1366875000, 1382400000, 1399680000, 1406250000, 1415577600,
|
||||
1417176000, 1423828125, 1433272320, 1440000000, 1451188224, 1458000000, 1464843750,
|
||||
1474560000, 1476225000, 1492992000, 1500000000, 1509949440, 1511654400, 1518750000,
|
||||
1528823808, 1530550080, 1536000000, 1537734375, 1555200000, 1562500000, 1572864000,
|
||||
1574640000, 1582031250, 1592524800, 1594323000, 1600000000, 1610612736, 1612431360,
|
||||
1620000000, 1632586752, 1638400000, 1640250000, 1658880000, 1660753125, 1677721600,
|
||||
1679616000, 1687500000, 1698693120, 1700611200, 1708593750, 1719926784, 1728000000,
|
||||
1749600000, 1757812500, 1769472000, 1771470000, 1791590400, 1800000000, 1811939328,
|
||||
1813985280, 1822500000, 1843200000, 1845281250, 1866240000, 1875000000, 1887436800,
|
||||
1889568000, 1898437500, 1911029760, 1913187600, 1920000000, 1934917632, 1944000000,
|
||||
1953125000, 1966080000, 1968300000, 1990656000, 1992903750, 2000000000, 2013265920,
|
||||
2015539200, 2025000000, 2038431744, 2040733440, 2048000000, 2050312500, 2073600000,
|
||||
2097152000, 2099520000, 2109375000, 2123366400, 2125764000
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
int cv::getOptimalDFTSize( int size0 )
|
||||
{
|
||||
int a = 0, b = sizeof(optimalDFTSizeTab)/sizeof(optimalDFTSizeTab[0]) - 1;
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -356,7 +356,7 @@ void magnitude( InputArray src1, InputArray src2, OutputArray dst )
|
||||
{
|
||||
Mat X = src1.getMat(), Y = src2.getMat();
|
||||
int type = X.type(), depth = X.depth(), cn = X.channels();
|
||||
CV_Assert( X.size == Y.size && type == Y.type() && (depth == CV_32F || depth == CV_64F));
|
||||
CV_Assert( X.size == Y.size && type == Y.type() && (depth == CV_32F || depth == CV_64F));
|
||||
dst.create(X.dims, X.size, X.type());
|
||||
Mat Mag = dst.getMat();
|
||||
|
||||
@@ -430,7 +430,7 @@ void phase( InputArray src1, InputArray src2, OutputArray dst, bool angleInDegre
|
||||
|
||||
FastAtan2_32f( buf[1], buf[0], buf[0], len, angleInDegrees );
|
||||
for( k = 0; k < len; k++ )
|
||||
angle[k] = buf[0][k];
|
||||
angle[k] = buf[0][k];
|
||||
}
|
||||
ptrs[0] += len*esz1;
|
||||
ptrs[1] += len*esz1;
|
||||
@@ -491,7 +491,7 @@ void cartToPolar( InputArray src1, InputArray src2,
|
||||
|
||||
FastAtan2_32f( buf[1], buf[0], buf[0], len, angleInDegrees );
|
||||
for( k = 0; k < len; k++ )
|
||||
angle[k] = buf[0][k];
|
||||
angle[k] = buf[0][k];
|
||||
}
|
||||
ptrs[0] += len*esz1;
|
||||
ptrs[1] += len*esz1;
|
||||
@@ -2249,15 +2249,15 @@ cvCartToPolar( const CvArr* xarr, const CvArr* yarr,
|
||||
Angle = cv::cvarrToMat(anglearr);
|
||||
CV_Assert( Angle.size() == X.size() && Angle.type() == X.type() );
|
||||
}
|
||||
if( magarr )
|
||||
{
|
||||
if( anglearr )
|
||||
cv::cartToPolar( X, Y, Mag, Angle, angle_in_degrees != 0 );
|
||||
else
|
||||
cv::magnitude( X, Y, Mag );
|
||||
}
|
||||
else
|
||||
cv::phase( X, Y, Angle, angle_in_degrees != 0 );
|
||||
if( magarr )
|
||||
{
|
||||
if( anglearr )
|
||||
cv::cartToPolar( X, Y, Mag, Angle, angle_in_degrees != 0 );
|
||||
else
|
||||
cv::magnitude( X, Y, Mag );
|
||||
}
|
||||
else
|
||||
cv::phase( X, Y, Angle, angle_in_degrees != 0 );
|
||||
}
|
||||
|
||||
CV_IMPL void
|
||||
|
@@ -2986,21 +2986,21 @@ PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, double reta
|
||||
g.at<float>(ig,0) += eigenvalues.at<float>(im,0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int L;
|
||||
for(L = 0; L < eigenvalues.rows; L++)
|
||||
{
|
||||
double energy = g.at<float>(L, 0) / g.at<float>(g.rows - 1, 0);
|
||||
if(energy > retainedVariance)
|
||||
break;
|
||||
if(energy > retainedVariance)
|
||||
break;
|
||||
}
|
||||
|
||||
L = std::max(2, L);
|
||||
|
||||
|
||||
// use clone() to physically copy the data and thus deallocate the original matrices
|
||||
eigenvalues = eigenvalues.rowRange(0,L).clone();
|
||||
eigenvectors = eigenvectors.rowRange(0,L).clone();
|
||||
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -5202,11 +5202,11 @@ string FileStorage::releaseAndGetString()
|
||||
string buf;
|
||||
if( fs.obj && fs.obj->outbuf )
|
||||
icvClose(fs.obj, &buf);
|
||||
|
||||
|
||||
release();
|
||||
return buf;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
FileNode FileStorage::root(int streamidx) const
|
||||
{
|
||||
return isOpened() ? FileNode(fs, cvGetRootFileNode(fs, streamidx)) : FileNode();
|
||||
|
@@ -170,7 +170,7 @@ struct NoVec
|
||||
};
|
||||
|
||||
extern volatile bool USE_SSE2;
|
||||
extern volatile bool USE_SSE4_2;
|
||||
extern volatile bool USE_SSE4_2;
|
||||
extern volatile bool USE_AVX;
|
||||
|
||||
enum { BLOCK_SIZE = 1024 };
|
||||
|
File diff suppressed because one or more lines are too long
@@ -243,7 +243,7 @@ static int countNonZero8u( const uchar* src, int len )
|
||||
}
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
|
||||
for (; i<=len-16; i+=16)
|
||||
{
|
||||
__m128i r0 = _mm_loadu_si128((const __m128i*)(src+i));
|
||||
@@ -1915,7 +1915,7 @@ void cv::findNonZero( InputArray _src, OutputArray _idx )
|
||||
Mat idx = _idx.getMat();
|
||||
CV_Assert(idx.isContinuous());
|
||||
Point* idx_ptr = (Point*)idx.data;
|
||||
|
||||
|
||||
for( int i = 0; i < src.rows; i++ )
|
||||
{
|
||||
const uchar* bin_ptr = src.ptr(i);
|
||||
|
@@ -805,7 +805,7 @@ struct Mutex::Impl
|
||||
CRITICAL_SECTION cs;
|
||||
int refcount;
|
||||
};
|
||||
|
||||
|
||||
int _interlockedExchangeAdd(int* addr, int delta)
|
||||
{
|
||||
#if defined _MSC_VER && _MSC_VER >= 1500
|
||||
|
@@ -104,7 +104,7 @@ const float g_8x32fTab[] =
|
||||
};
|
||||
|
||||
/* [-255..255].^2 */
|
||||
const ushort g_8x16uSqrTab[] =
|
||||
const ushort g_8x16uSqrTab[] =
|
||||
{
|
||||
65025, 64516, 64009, 63504, 63001, 62500, 62001, 61504, 61009, 60516, 60025, 59536,
|
||||
59049, 58564, 58081, 57600, 57121, 56644, 56169, 55696, 55225, 54756, 54289, 53824,
|
||||
@@ -151,7 +151,7 @@ const ushort g_8x16uSqrTab[] =
|
||||
62001, 62500, 63001, 63504, 64009, 64516, 65025
|
||||
};
|
||||
|
||||
const uchar g_Saturate8u[] =
|
||||
const uchar g_Saturate8u[] =
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
|
@@ -1,255 +1,255 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's 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.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
#include <time.h>
|
||||
#include <limits>
|
||||
using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
#define CORE_COUNTNONZERO_ERROR_COUNT 1
|
||||
|
||||
#define MESSAGE_ERROR_COUNT "Count non zero elements returned by OpenCV function is incorrect."
|
||||
|
||||
#define sign(a) a > 0 ? 1 : a == 0 ? 0 : -1
|
||||
|
||||
const int FLOAT_TYPE [2] = {CV_32F, CV_64F};
|
||||
const int INT_TYPE [5] = {CV_8U, CV_8S, CV_16U, CV_16S, CV_32S};
|
||||
|
||||
#define MAX_WIDTH 100
|
||||
#define MAX_HEIGHT 100
|
||||
|
||||
class CV_CountNonZeroTest: public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
CV_CountNonZeroTest();
|
||||
~CV_CountNonZeroTest();
|
||||
|
||||
protected:
|
||||
void run (int);
|
||||
|
||||
private:
|
||||
float eps_32;
|
||||
double eps_64;
|
||||
Mat src;
|
||||
int current_type;
|
||||
|
||||
void generate_src_data(cv::Size size, int type);
|
||||
void generate_src_data(cv::Size size, int type, int count_non_zero);
|
||||
void generate_src_stat_data(cv::Size size, int type, int distribution);
|
||||
|
||||
int get_count_non_zero();
|
||||
|
||||
void print_information(int right, int result);
|
||||
};
|
||||
|
||||
CV_CountNonZeroTest::CV_CountNonZeroTest(): eps_32(std::numeric_limits<float>::min()), eps_64(std::numeric_limits<double>::min()), src(Mat()), current_type(-1) {}
|
||||
CV_CountNonZeroTest::~CV_CountNonZeroTest() {}
|
||||
|
||||
void CV_CountNonZeroTest::generate_src_data(cv::Size size, int type)
|
||||
{
|
||||
src.create(size, CV_MAKETYPE(type, 1));
|
||||
|
||||
for (int j = 0; j < size.width; ++j)
|
||||
for (int i = 0; i < size.height; ++i)
|
||||
switch (type)
|
||||
{
|
||||
case CV_8U: { src.at<uchar>(i, j) = cv::randu<uchar>(); break; }
|
||||
case CV_8S: { src.at<char>(i, j) = cv::randu<uchar>() - 128; break; }
|
||||
case CV_16U: { src.at<ushort>(i, j) = cv::randu<ushort>(); break; }
|
||||
case CV_16S: { src.at<short>(i, j) = cv::randu<short>(); break; }
|
||||
case CV_32S: { src.at<int>(i, j) = cv::randu<int>(); break; }
|
||||
case CV_32F: { src.at<float>(i, j) = cv::randu<float>(); break; }
|
||||
case CV_64F: { src.at<double>(i, j) = cv::randu<double>(); break; }
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
void CV_CountNonZeroTest::generate_src_data(cv::Size size, int type, int count_non_zero)
|
||||
{
|
||||
src = Mat::zeros(size, CV_MAKETYPE(type, 1));
|
||||
|
||||
int n = 0; RNG& rng = ts->get_rng();
|
||||
|
||||
while (n < count_non_zero)
|
||||
{
|
||||
int i = rng.next()%size.height, j = rng.next()%size.width;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case CV_8U: { if (!src.at<uchar>(i, j)) {src.at<uchar>(i, j) = cv::randu<uchar>(); n += (src.at<uchar>(i, j) > 0);} break; }
|
||||
case CV_8S: { if (!src.at<char>(i, j)) {src.at<char>(i, j) = cv::randu<uchar>() - 128; n += abs(sign(src.at<char>(i, j)));} break; }
|
||||
case CV_16U: { if (!src.at<ushort>(i, j)) {src.at<ushort>(i, j) = cv::randu<ushort>(); n += (src.at<ushort>(i, j) > 0);} break; }
|
||||
case CV_16S: { if (!src.at<short>(i, j)) {src.at<short>(i, j) = cv::randu<short>(); n += abs(sign(src.at<short>(i, j)));} break; }
|
||||
case CV_32S: { if (!src.at<int>(i, j)) {src.at<int>(i, j) = cv::randu<int>(); n += abs(sign(src.at<int>(i, j)));} break; }
|
||||
case CV_32F: { if (fabs(src.at<float>(i, j)) <= eps_32) {src.at<float>(i, j) = cv::randu<float>(); n += (fabs(src.at<float>(i, j)) > eps_32);} break; }
|
||||
case CV_64F: { if (fabs(src.at<double>(i, j)) <= eps_64) {src.at<double>(i, j) = cv::randu<double>(); n += (fabs(src.at<double>(i, j)) > eps_64);} break; }
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CV_CountNonZeroTest::generate_src_stat_data(cv::Size size, int type, int distribution)
|
||||
{
|
||||
src.create(size, CV_MAKETYPE(type, 1));
|
||||
|
||||
double mean = 0.0, sigma = 1.0;
|
||||
double left = -1.0, right = 1.0;
|
||||
|
||||
RNG& rng = ts->get_rng();
|
||||
|
||||
if (distribution == RNG::NORMAL)
|
||||
rng.fill(src, RNG::NORMAL, Scalar::all(mean), Scalar::all(sigma));
|
||||
else if (distribution == RNG::UNIFORM)
|
||||
rng.fill(src, RNG::UNIFORM, Scalar::all(left), Scalar::all(right));
|
||||
}
|
||||
|
||||
int CV_CountNonZeroTest::get_count_non_zero()
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
for (int i = 0; i < src.rows; ++i)
|
||||
for (int j = 0; j < src.cols; ++j)
|
||||
{
|
||||
if (current_type == CV_8U) result += (src.at<uchar>(i, j) > 0);
|
||||
else if (current_type == CV_8S) result += abs(sign(src.at<char>(i, j)));
|
||||
else if (current_type == CV_16U) result += (src.at<ushort>(i, j) > 0);
|
||||
else if (current_type == CV_16S) result += abs(sign(src.at<short>(i, j)));
|
||||
else if (current_type == CV_32S) result += abs(sign(src.at<int>(i, j)));
|
||||
else if (current_type == CV_32F) result += (fabs(src.at<float>(i, j)) > eps_32);
|
||||
else result += (fabs(src.at<double>(i, j)) > eps_64);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void CV_CountNonZeroTest::print_information(int right, int result)
|
||||
{
|
||||
cout << endl; cout << "Checking for the work of countNonZero function..." << endl; cout << endl;
|
||||
cout << "Type of Mat: ";
|
||||
switch (current_type)
|
||||
{
|
||||
case 0: {cout << "CV_8U"; break;}
|
||||
case 1: {cout << "CV_8S"; break;}
|
||||
case 2: {cout << "CV_16U"; break;}
|
||||
case 3: {cout << "CV_16S"; break;}
|
||||
case 4: {cout << "CV_32S"; break;}
|
||||
case 5: {cout << "CV_32F"; break;}
|
||||
case 6: {cout << "CV_64F"; break;}
|
||||
default: break;
|
||||
}
|
||||
cout << endl;
|
||||
cout << "Number of rows: " << src.rows << " Number of cols: " << src.cols << endl;
|
||||
cout << "True count non zero elements: " << right << " Result: " << result << endl;
|
||||
cout << endl;
|
||||
}
|
||||
|
||||
void CV_CountNonZeroTest::run(int)
|
||||
{
|
||||
const size_t N = 1500;
|
||||
|
||||
for (int k = 1; k <= 3; ++k)
|
||||
for (size_t i = 0; i < N; ++i)
|
||||
{
|
||||
RNG& rng = ts->get_rng();
|
||||
|
||||
int w = rng.next()%MAX_WIDTH + 1, h = rng.next()%MAX_HEIGHT + 1;
|
||||
|
||||
current_type = rng.next()%7;
|
||||
|
||||
switch (k)
|
||||
{
|
||||
case 1: {
|
||||
generate_src_data(Size(w, h), current_type);
|
||||
int right = get_count_non_zero(), result = countNonZero(src);
|
||||
if (result != right)
|
||||
{
|
||||
cout << "Number of experiment: " << i << endl;
|
||||
cout << "Method of data generation: RANDOM" << endl;
|
||||
print_information(right, result);
|
||||
CV_Error(CORE_COUNTNONZERO_ERROR_COUNT, MESSAGE_ERROR_COUNT);
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 2: {
|
||||
int count_non_zero = rng.next()%(w*h);
|
||||
generate_src_data(Size(w, h), current_type, count_non_zero);
|
||||
int result = countNonZero(src);
|
||||
if (result != count_non_zero)
|
||||
{
|
||||
cout << "Number of experiment: " << i << endl;
|
||||
cout << "Method of data generation: HALF-RANDOM" << endl;
|
||||
print_information(count_non_zero, result);
|
||||
CV_Error(CORE_COUNTNONZERO_ERROR_COUNT, MESSAGE_ERROR_COUNT);
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 3: {
|
||||
int distribution = cv::randu<uchar>()%2;
|
||||
generate_src_stat_data(Size(w, h), current_type, distribution);
|
||||
int right = get_count_non_zero(), result = countNonZero(src);
|
||||
if (right != result)
|
||||
{
|
||||
cout << "Number of experiment: " << i << endl;
|
||||
cout << "Method of data generation: STATISTIC" << endl;
|
||||
print_information(right, result);
|
||||
CV_Error(CORE_COUNTNONZERO_ERROR_COUNT, MESSAGE_ERROR_COUNT);
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST (Core_CountNonZero, accuracy) { CV_CountNonZeroTest test; test.safe_run(); }
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's 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.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
#include <time.h>
|
||||
#include <limits>
|
||||
using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
#define CORE_COUNTNONZERO_ERROR_COUNT 1
|
||||
|
||||
#define MESSAGE_ERROR_COUNT "Count non zero elements returned by OpenCV function is incorrect."
|
||||
|
||||
#define sign(a) a > 0 ? 1 : a == 0 ? 0 : -1
|
||||
|
||||
const int FLOAT_TYPE [2] = {CV_32F, CV_64F};
|
||||
const int INT_TYPE [5] = {CV_8U, CV_8S, CV_16U, CV_16S, CV_32S};
|
||||
|
||||
#define MAX_WIDTH 100
|
||||
#define MAX_HEIGHT 100
|
||||
|
||||
class CV_CountNonZeroTest: public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
CV_CountNonZeroTest();
|
||||
~CV_CountNonZeroTest();
|
||||
|
||||
protected:
|
||||
void run (int);
|
||||
|
||||
private:
|
||||
float eps_32;
|
||||
double eps_64;
|
||||
Mat src;
|
||||
int current_type;
|
||||
|
||||
void generate_src_data(cv::Size size, int type);
|
||||
void generate_src_data(cv::Size size, int type, int count_non_zero);
|
||||
void generate_src_stat_data(cv::Size size, int type, int distribution);
|
||||
|
||||
int get_count_non_zero();
|
||||
|
||||
void print_information(int right, int result);
|
||||
};
|
||||
|
||||
CV_CountNonZeroTest::CV_CountNonZeroTest(): eps_32(std::numeric_limits<float>::min()), eps_64(std::numeric_limits<double>::min()), src(Mat()), current_type(-1) {}
|
||||
CV_CountNonZeroTest::~CV_CountNonZeroTest() {}
|
||||
|
||||
void CV_CountNonZeroTest::generate_src_data(cv::Size size, int type)
|
||||
{
|
||||
src.create(size, CV_MAKETYPE(type, 1));
|
||||
|
||||
for (int j = 0; j < size.width; ++j)
|
||||
for (int i = 0; i < size.height; ++i)
|
||||
switch (type)
|
||||
{
|
||||
case CV_8U: { src.at<uchar>(i, j) = cv::randu<uchar>(); break; }
|
||||
case CV_8S: { src.at<char>(i, j) = cv::randu<uchar>() - 128; break; }
|
||||
case CV_16U: { src.at<ushort>(i, j) = cv::randu<ushort>(); break; }
|
||||
case CV_16S: { src.at<short>(i, j) = cv::randu<short>(); break; }
|
||||
case CV_32S: { src.at<int>(i, j) = cv::randu<int>(); break; }
|
||||
case CV_32F: { src.at<float>(i, j) = cv::randu<float>(); break; }
|
||||
case CV_64F: { src.at<double>(i, j) = cv::randu<double>(); break; }
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
void CV_CountNonZeroTest::generate_src_data(cv::Size size, int type, int count_non_zero)
|
||||
{
|
||||
src = Mat::zeros(size, CV_MAKETYPE(type, 1));
|
||||
|
||||
int n = 0; RNG& rng = ts->get_rng();
|
||||
|
||||
while (n < count_non_zero)
|
||||
{
|
||||
int i = rng.next()%size.height, j = rng.next()%size.width;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case CV_8U: { if (!src.at<uchar>(i, j)) {src.at<uchar>(i, j) = cv::randu<uchar>(); n += (src.at<uchar>(i, j) > 0);} break; }
|
||||
case CV_8S: { if (!src.at<char>(i, j)) {src.at<char>(i, j) = cv::randu<uchar>() - 128; n += abs(sign(src.at<char>(i, j)));} break; }
|
||||
case CV_16U: { if (!src.at<ushort>(i, j)) {src.at<ushort>(i, j) = cv::randu<ushort>(); n += (src.at<ushort>(i, j) > 0);} break; }
|
||||
case CV_16S: { if (!src.at<short>(i, j)) {src.at<short>(i, j) = cv::randu<short>(); n += abs(sign(src.at<short>(i, j)));} break; }
|
||||
case CV_32S: { if (!src.at<int>(i, j)) {src.at<int>(i, j) = cv::randu<int>(); n += abs(sign(src.at<int>(i, j)));} break; }
|
||||
case CV_32F: { if (fabs(src.at<float>(i, j)) <= eps_32) {src.at<float>(i, j) = cv::randu<float>(); n += (fabs(src.at<float>(i, j)) > eps_32);} break; }
|
||||
case CV_64F: { if (fabs(src.at<double>(i, j)) <= eps_64) {src.at<double>(i, j) = cv::randu<double>(); n += (fabs(src.at<double>(i, j)) > eps_64);} break; }
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CV_CountNonZeroTest::generate_src_stat_data(cv::Size size, int type, int distribution)
|
||||
{
|
||||
src.create(size, CV_MAKETYPE(type, 1));
|
||||
|
||||
double mean = 0.0, sigma = 1.0;
|
||||
double left = -1.0, right = 1.0;
|
||||
|
||||
RNG& rng = ts->get_rng();
|
||||
|
||||
if (distribution == RNG::NORMAL)
|
||||
rng.fill(src, RNG::NORMAL, Scalar::all(mean), Scalar::all(sigma));
|
||||
else if (distribution == RNG::UNIFORM)
|
||||
rng.fill(src, RNG::UNIFORM, Scalar::all(left), Scalar::all(right));
|
||||
}
|
||||
|
||||
int CV_CountNonZeroTest::get_count_non_zero()
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
for (int i = 0; i < src.rows; ++i)
|
||||
for (int j = 0; j < src.cols; ++j)
|
||||
{
|
||||
if (current_type == CV_8U) result += (src.at<uchar>(i, j) > 0);
|
||||
else if (current_type == CV_8S) result += abs(sign(src.at<char>(i, j)));
|
||||
else if (current_type == CV_16U) result += (src.at<ushort>(i, j) > 0);
|
||||
else if (current_type == CV_16S) result += abs(sign(src.at<short>(i, j)));
|
||||
else if (current_type == CV_32S) result += abs(sign(src.at<int>(i, j)));
|
||||
else if (current_type == CV_32F) result += (fabs(src.at<float>(i, j)) > eps_32);
|
||||
else result += (fabs(src.at<double>(i, j)) > eps_64);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void CV_CountNonZeroTest::print_information(int right, int result)
|
||||
{
|
||||
cout << endl; cout << "Checking for the work of countNonZero function..." << endl; cout << endl;
|
||||
cout << "Type of Mat: ";
|
||||
switch (current_type)
|
||||
{
|
||||
case 0: {cout << "CV_8U"; break;}
|
||||
case 1: {cout << "CV_8S"; break;}
|
||||
case 2: {cout << "CV_16U"; break;}
|
||||
case 3: {cout << "CV_16S"; break;}
|
||||
case 4: {cout << "CV_32S"; break;}
|
||||
case 5: {cout << "CV_32F"; break;}
|
||||
case 6: {cout << "CV_64F"; break;}
|
||||
default: break;
|
||||
}
|
||||
cout << endl;
|
||||
cout << "Number of rows: " << src.rows << " Number of cols: " << src.cols << endl;
|
||||
cout << "True count non zero elements: " << right << " Result: " << result << endl;
|
||||
cout << endl;
|
||||
}
|
||||
|
||||
void CV_CountNonZeroTest::run(int)
|
||||
{
|
||||
const size_t N = 1500;
|
||||
|
||||
for (int k = 1; k <= 3; ++k)
|
||||
for (size_t i = 0; i < N; ++i)
|
||||
{
|
||||
RNG& rng = ts->get_rng();
|
||||
|
||||
int w = rng.next()%MAX_WIDTH + 1, h = rng.next()%MAX_HEIGHT + 1;
|
||||
|
||||
current_type = rng.next()%7;
|
||||
|
||||
switch (k)
|
||||
{
|
||||
case 1: {
|
||||
generate_src_data(Size(w, h), current_type);
|
||||
int right = get_count_non_zero(), result = countNonZero(src);
|
||||
if (result != right)
|
||||
{
|
||||
cout << "Number of experiment: " << i << endl;
|
||||
cout << "Method of data generation: RANDOM" << endl;
|
||||
print_information(right, result);
|
||||
CV_Error(CORE_COUNTNONZERO_ERROR_COUNT, MESSAGE_ERROR_COUNT);
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 2: {
|
||||
int count_non_zero = rng.next()%(w*h);
|
||||
generate_src_data(Size(w, h), current_type, count_non_zero);
|
||||
int result = countNonZero(src);
|
||||
if (result != count_non_zero)
|
||||
{
|
||||
cout << "Number of experiment: " << i << endl;
|
||||
cout << "Method of data generation: HALF-RANDOM" << endl;
|
||||
print_information(count_non_zero, result);
|
||||
CV_Error(CORE_COUNTNONZERO_ERROR_COUNT, MESSAGE_ERROR_COUNT);
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 3: {
|
||||
int distribution = cv::randu<uchar>()%2;
|
||||
generate_src_stat_data(Size(w, h), current_type, distribution);
|
||||
int right = get_count_non_zero(), result = countNonZero(src);
|
||||
if (right != result)
|
||||
{
|
||||
cout << "Number of experiment: " << i << endl;
|
||||
cout << "Method of data generation: STATISTIC" << endl;
|
||||
print_information(right, result);
|
||||
CV_Error(CORE_COUNTNONZERO_ERROR_COUNT, MESSAGE_ERROR_COUNT);
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST (Core_CountNonZero, accuracy) { CV_CountNonZeroTest test; test.safe_run(); }
|
||||
|
@@ -13,12 +13,12 @@ static Mat initDFTWave( int n, bool inv )
|
||||
Complexd wi, w1;
|
||||
Mat wave(1, n, CV_64FC2);
|
||||
Complexd* w = wave.ptr<Complexd>();
|
||||
|
||||
|
||||
w1.re = cos(angle);
|
||||
w1.im = sin(angle);
|
||||
w[0].re = wi.re = 1.;
|
||||
w[0].im = wi.im = 0.;
|
||||
|
||||
|
||||
for( i = 1; i < n; i++ )
|
||||
{
|
||||
double t = wi.re*w1.re - wi.im*w1.im;
|
||||
@@ -26,7 +26,7 @@ static Mat initDFTWave( int n, bool inv )
|
||||
wi.re = t;
|
||||
w[i] = wi;
|
||||
}
|
||||
|
||||
|
||||
return wave;
|
||||
}
|
||||
|
||||
@@ -41,18 +41,18 @@ static void DFT_1D( const Mat& _src, Mat& _dst, int flags, const Mat& _wave=Mat(
|
||||
size_t srcstep = esz, dststep = esz;
|
||||
const uchar* src0 = _src.data;
|
||||
uchar* dst0 = _dst.data;
|
||||
|
||||
|
||||
CV_Assert( _src.cols + _src.rows - 1 == n );
|
||||
|
||||
|
||||
if( wave.empty() )
|
||||
wave = initDFTWave( n, (flags & DFT_INVERSE) != 0 );
|
||||
|
||||
|
||||
const Complexd* w = wave.ptr<Complexd>();
|
||||
if( !_src.isContinuous() )
|
||||
srcstep = _src.step;
|
||||
if( !_dst.isContinuous() )
|
||||
dststep = _dst.step;
|
||||
|
||||
|
||||
if( _src.type() == CV_32FC2 )
|
||||
{
|
||||
for( i = 0; i < n; i++ )
|
||||
@@ -61,7 +61,7 @@ static void DFT_1D( const Mat& _src, Mat& _dst, int flags, const Mat& _wave=Mat(
|
||||
Complexd sum(0,0);
|
||||
int delta = i;
|
||||
k = 0;
|
||||
|
||||
|
||||
for( j = 0; j < n; j++ )
|
||||
{
|
||||
const Complexf* src = (const Complexf*)(src0 + j*srcstep);
|
||||
@@ -70,7 +70,7 @@ static void DFT_1D( const Mat& _src, Mat& _dst, int flags, const Mat& _wave=Mat(
|
||||
k += delta;
|
||||
k -= (k >= n ? n : 0);
|
||||
}
|
||||
|
||||
|
||||
dst->re = (float)(sum.re*scale);
|
||||
dst->im = (float)(sum.im*scale);
|
||||
}
|
||||
@@ -83,7 +83,7 @@ static void DFT_1D( const Mat& _src, Mat& _dst, int flags, const Mat& _wave=Mat(
|
||||
Complexd sum(0,0);
|
||||
int delta = i;
|
||||
k = 0;
|
||||
|
||||
|
||||
for( j = 0; j < n; j++ )
|
||||
{
|
||||
const Complexd* src = (const Complexd*)(src0 + j*srcstep);
|
||||
@@ -92,7 +92,7 @@ static void DFT_1D( const Mat& _src, Mat& _dst, int flags, const Mat& _wave=Mat(
|
||||
k += delta;
|
||||
k -= (k >= n ? n : 0);
|
||||
}
|
||||
|
||||
|
||||
dst->re = sum.re*scale;
|
||||
dst->im = sum.im*scale;
|
||||
}
|
||||
@@ -109,19 +109,19 @@ static void DFT_2D( const Mat& src, Mat& dst, int flags )
|
||||
dst.create(src.size(), src.type());
|
||||
Mat tmp( src.cols, src.rows, src.type());
|
||||
Mat wave = initDFTWave( dst.cols, (flags & DFT_INVERSE) != 0 );
|
||||
|
||||
|
||||
// 1. row-wise transform
|
||||
for( i = 0; i < dst.rows; i++ )
|
||||
{
|
||||
Mat srci = src.row(i).reshape(cn, src.cols), dsti = tmp.col(i);
|
||||
DFT_1D(srci, dsti, flags, wave );
|
||||
}
|
||||
|
||||
|
||||
if( (flags & DFT_ROWS) == 0 )
|
||||
{
|
||||
if( dst.cols != dst.rows )
|
||||
wave = initDFTWave( dst.rows, (flags & DFT_INVERSE) != 0 );
|
||||
|
||||
|
||||
// 2. column-wise transform
|
||||
for( i = 0; i < dst.cols; i++ )
|
||||
{
|
||||
@@ -139,7 +139,7 @@ static Mat initDCTWave( int n, bool inv )
|
||||
int i, k;
|
||||
double angle = CV_PI*0.5/n;
|
||||
Mat wave(n, n, CV_64F);
|
||||
|
||||
|
||||
double scale = sqrt(1./n);
|
||||
for( k = 0; k < n; k++ )
|
||||
wave.at<double>(0, k) = scale;
|
||||
@@ -147,10 +147,10 @@ static Mat initDCTWave( int n, bool inv )
|
||||
for( i = 1; i < n; i++ )
|
||||
for( k = 0; k < n; k++ )
|
||||
wave.at<double>(i, k) = scale*cos( angle*i*(2*k + 1) );
|
||||
|
||||
|
||||
if( inv )
|
||||
cv::transpose( wave, wave );
|
||||
|
||||
|
||||
return wave;
|
||||
}
|
||||
|
||||
@@ -162,27 +162,27 @@ static void DCT_1D( const Mat& _src, Mat& _dst, int flags, const Mat& _wave=Mat(
|
||||
Mat wave = _wave;
|
||||
int srcstep = 1, dststep = 1;
|
||||
double* w;
|
||||
|
||||
|
||||
CV_Assert( _src.cols + _src.rows - 1 == n);
|
||||
|
||||
|
||||
if( wave.empty() )
|
||||
wave = initDCTWave( n, (flags & DFT_INVERSE) != 0 );
|
||||
w = wave.ptr<double>();
|
||||
|
||||
|
||||
if( !_src.isContinuous() )
|
||||
srcstep = (int)(_src.step/_src.elemSize());
|
||||
if( !_dst.isContinuous() )
|
||||
dststep = (int)(_dst.step/_dst.elemSize());
|
||||
|
||||
|
||||
if( _src.type() == CV_32FC1 )
|
||||
{
|
||||
float *dst = _dst.ptr<float>();
|
||||
|
||||
|
||||
for( i = 0; i < n; i++, dst += dststep )
|
||||
{
|
||||
const float* src = _src.ptr<float>();
|
||||
double sum = 0;
|
||||
|
||||
|
||||
for( j = 0; j < n; j++, src += srcstep )
|
||||
sum += src[0]*w[j];
|
||||
w += n;
|
||||
@@ -192,12 +192,12 @@ static void DCT_1D( const Mat& _src, Mat& _dst, int flags, const Mat& _wave=Mat(
|
||||
else if( _src.type() == CV_64FC1 )
|
||||
{
|
||||
double *dst = _dst.ptr<double>();
|
||||
|
||||
|
||||
for( i = 0; i < n; i++, dst += dststep )
|
||||
{
|
||||
const double* src = _src.ptr<double>();
|
||||
double sum = 0;
|
||||
|
||||
|
||||
for( j = 0; j < n; j++, src += srcstep )
|
||||
sum += src[0]*w[j];
|
||||
w += n;
|
||||
@@ -216,7 +216,7 @@ static void DCT_2D( const Mat& src, Mat& dst, int flags )
|
||||
dst.create( src.size(), src.type() );
|
||||
Mat tmp(dst.cols, dst.rows, dst.type() );
|
||||
Mat wave = initDCTWave( dst.cols, (flags & DCT_INVERSE) != 0 );
|
||||
|
||||
|
||||
// 1. row-wise transform
|
||||
for( i = 0; i < dst.rows; i++ )
|
||||
{
|
||||
@@ -224,12 +224,12 @@ static void DCT_2D( const Mat& src, Mat& dst, int flags )
|
||||
Mat dsti = tmp.col(i);
|
||||
DCT_1D(srci, dsti, flags, wave);
|
||||
}
|
||||
|
||||
|
||||
if( (flags & DCT_ROWS) == 0 )
|
||||
{
|
||||
if( dst.cols != dst.rows )
|
||||
wave = initDCTWave( dst.rows, (flags & DCT_INVERSE) != 0 );
|
||||
|
||||
|
||||
// 2. column-wise transform
|
||||
for( i = 0; i < dst.cols; i++ )
|
||||
{
|
||||
@@ -258,7 +258,7 @@ static void convertFromCCS( const Mat& _src0, const Mat& _src1, Mat& _dst, int f
|
||||
dstrow = _dst.row(i);
|
||||
convertFromCCS( src0row, src1row, dstrow, 0 );
|
||||
}
|
||||
|
||||
|
||||
if( is2d )
|
||||
{
|
||||
src0row = _src0.col(0);
|
||||
@@ -277,45 +277,45 @@ static void convertFromCCS( const Mat& _src0, const Mat& _src1, Mat& _dst, int f
|
||||
int i, n = _dst.cols + _dst.rows - 1, n2 = (n+1) >> 1;
|
||||
int cn = _src0.channels();
|
||||
int srcstep = cn, dststep = 1;
|
||||
|
||||
|
||||
if( !_dst.isContinuous() )
|
||||
dststep = (int)(_dst.step/_dst.elemSize());
|
||||
|
||||
|
||||
if( !_src0.isContinuous() )
|
||||
srcstep = (int)(_src0.step/_src0.elemSize1());
|
||||
|
||||
|
||||
if( _dst.depth() == CV_32F )
|
||||
{
|
||||
Complexf* dst = _dst.ptr<Complexf>();
|
||||
const float* src0 = _src0.ptr<float>();
|
||||
const float* src1 = _src1.ptr<float>();
|
||||
int delta0, delta1;
|
||||
|
||||
|
||||
dst->re = src0[0];
|
||||
dst->im = 0;
|
||||
|
||||
|
||||
if( (n & 1) == 0 )
|
||||
{
|
||||
dst[n2*dststep].re = src0[(cn == 1 ? n-1 : n2)*srcstep];
|
||||
dst[n2*dststep].im = 0;
|
||||
}
|
||||
|
||||
|
||||
delta0 = srcstep;
|
||||
delta1 = delta0 + (cn == 1 ? srcstep : 1);
|
||||
if( cn == 1 )
|
||||
srcstep *= 2;
|
||||
|
||||
|
||||
for( i = 1; i < n2; i++, delta0 += srcstep, delta1 += srcstep )
|
||||
{
|
||||
float t0 = src0[delta0];
|
||||
float t1 = src0[delta1];
|
||||
|
||||
|
||||
dst[i*dststep].re = t0;
|
||||
dst[i*dststep].im = t1;
|
||||
|
||||
|
||||
t0 = src1[delta0];
|
||||
t1 = -src1[delta1];
|
||||
|
||||
|
||||
dst[(n-i)*dststep].re = t0;
|
||||
dst[(n-i)*dststep].im = t1;
|
||||
}
|
||||
@@ -326,32 +326,32 @@ static void convertFromCCS( const Mat& _src0, const Mat& _src1, Mat& _dst, int f
|
||||
const double* src0 = _src0.ptr<double>();
|
||||
const double* src1 = _src1.ptr<double>();
|
||||
int delta0, delta1;
|
||||
|
||||
|
||||
dst->re = src0[0];
|
||||
dst->im = 0;
|
||||
|
||||
|
||||
if( (n & 1) == 0 )
|
||||
{
|
||||
dst[n2*dststep].re = src0[(cn == 1 ? n-1 : n2)*srcstep];
|
||||
dst[n2*dststep].im = 0;
|
||||
}
|
||||
|
||||
|
||||
delta0 = srcstep;
|
||||
delta1 = delta0 + (cn == 1 ? srcstep : 1);
|
||||
if( cn == 1 )
|
||||
srcstep *= 2;
|
||||
|
||||
|
||||
for( i = 1; i < n2; i++, delta0 += srcstep, delta1 += srcstep )
|
||||
{
|
||||
double t0 = src0[delta0];
|
||||
double t1 = src0[delta1];
|
||||
|
||||
|
||||
dst[i*dststep].re = t0;
|
||||
dst[i*dststep].im = t1;
|
||||
|
||||
|
||||
t0 = src1[delta0];
|
||||
t1 = -src1[delta1];
|
||||
|
||||
|
||||
dst[(n-i)*dststep].re = t0;
|
||||
dst[(n-i)*dststep].im = t1;
|
||||
}
|
||||
@@ -364,9 +364,9 @@ static void fixCCS( Mat& mat, int cols, int flags )
|
||||
{
|
||||
int i, rows = mat.rows;
|
||||
int rows2 = (flags & DFT_ROWS) ? rows : rows/2 + 1, cols2 = cols/2 + 1;
|
||||
|
||||
|
||||
CV_Assert( cols2 == mat.cols );
|
||||
|
||||
|
||||
if( mat.type() == CV_32FC2 )
|
||||
{
|
||||
for( i = 0; i < rows2; i++ )
|
||||
@@ -383,7 +383,7 @@ static void fixCCS( Mat& mat, int cols, int flags )
|
||||
Complexf* row2 = mat.ptr<Complexf>(rows-i);
|
||||
row2[0].re = row[0].re;
|
||||
row2[0].im = -row[0].im;
|
||||
|
||||
|
||||
if( cols % 2 == 0 )
|
||||
{
|
||||
row2[cols2-1].re = row[cols2-1].re;
|
||||
@@ -408,7 +408,7 @@ static void fixCCS( Mat& mat, int cols, int flags )
|
||||
Complexd* row2 = mat.ptr<Complexd>(rows-i);
|
||||
row2[0].re = row[0].re;
|
||||
row2[0].im = -row[0].im;
|
||||
|
||||
|
||||
if( cols % 2 == 0 )
|
||||
{
|
||||
row2[cols2-1].re = row[cols2-1].re;
|
||||
@@ -418,16 +418,16 @@ static void fixCCS( Mat& mat, int cols, int flags )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void mulComplex( const Mat& src1, const Mat& src2, Mat& dst, int flags )
|
||||
{
|
||||
dst.create(src1.rows, src1.cols, src1.type());
|
||||
int i, j, depth = src1.depth(), cols = src1.cols*2;
|
||||
|
||||
|
||||
CV_Assert( src1.size == src2.size && src1.type() == src2.type() &&
|
||||
(src1.type() == CV_32FC2 || src1.type() == CV_64FC2) );
|
||||
|
||||
|
||||
for( i = 0; i < dst.rows; i++ )
|
||||
{
|
||||
if( depth == CV_32F )
|
||||
@@ -435,13 +435,13 @@ static void mulComplex( const Mat& src1, const Mat& src2, Mat& dst, int flags )
|
||||
const float* a = src1.ptr<float>(i);
|
||||
const float* b = src2.ptr<float>(i);
|
||||
float* c = dst.ptr<float>(i);
|
||||
|
||||
|
||||
if( !(flags & CV_DXT_MUL_CONJ) )
|
||||
for( j = 0; j < cols; j += 2 )
|
||||
{
|
||||
double re = (double)a[j]*b[j] - (double)a[j+1]*b[j+1];
|
||||
double im = (double)a[j+1]*b[j] + (double)a[j]*b[j+1];
|
||||
|
||||
|
||||
c[j] = (float)re;
|
||||
c[j+1] = (float)im;
|
||||
}
|
||||
@@ -450,7 +450,7 @@ static void mulComplex( const Mat& src1, const Mat& src2, Mat& dst, int flags )
|
||||
{
|
||||
double re = (double)a[j]*b[j] + (double)a[j+1]*b[j+1];
|
||||
double im = (double)a[j+1]*b[j] - (double)a[j]*b[j+1];
|
||||
|
||||
|
||||
c[j] = (float)re;
|
||||
c[j+1] = (float)im;
|
||||
}
|
||||
@@ -460,13 +460,13 @@ static void mulComplex( const Mat& src1, const Mat& src2, Mat& dst, int flags )
|
||||
const double* a = src1.ptr<double>(i);
|
||||
const double* b = src2.ptr<double>(i);
|
||||
double* c = dst.ptr<double>(i);
|
||||
|
||||
|
||||
if( !(flags & CV_DXT_MUL_CONJ) )
|
||||
for( j = 0; j < cols; j += 2 )
|
||||
{
|
||||
double re = a[j]*b[j] - a[j+1]*b[j+1];
|
||||
double im = a[j+1]*b[j] + a[j]*b[j+1];
|
||||
|
||||
|
||||
c[j] = re;
|
||||
c[j+1] = im;
|
||||
}
|
||||
@@ -475,14 +475,14 @@ static void mulComplex( const Mat& src1, const Mat& src2, Mat& dst, int flags )
|
||||
{
|
||||
double re = a[j]*b[j] + a[j+1]*b[j+1];
|
||||
double im = a[j+1]*b[j] - a[j]*b[j+1];
|
||||
|
||||
|
||||
c[j] = re;
|
||||
c[j+1] = im;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -519,7 +519,7 @@ spectrum_mode(_spectrum_mode), inplace(false), temp_dst(false)
|
||||
test_array[REF_OUTPUT].push_back(NULL);
|
||||
test_array[TEMP].push_back(NULL);
|
||||
test_array[TEMP].push_back(NULL);
|
||||
|
||||
|
||||
max_log_array_size = 9;
|
||||
element_wise_relative_error = spectrum_mode;
|
||||
}
|
||||
@@ -535,16 +535,16 @@ void CxCore_DXTBaseTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
int cn = !allow_complex || !(bits & 256) ? 1 : 2;
|
||||
Size size;
|
||||
Base::get_test_array_types_and_sizes( test_case_idx, sizes, types );
|
||||
|
||||
|
||||
flags = bits & (CV_DXT_INVERSE | CV_DXT_SCALE | CV_DXT_ROWS | CV_DXT_MUL_CONJ);
|
||||
if( spectrum_mode )
|
||||
flags &= ~CV_DXT_INVERSE;
|
||||
types[TEMP][0] = types[TEMP][1] = types[INPUT][0] =
|
||||
types[OUTPUT][0] = CV_MAKETYPE(depth, cn);
|
||||
size = sizes[INPUT][0];
|
||||
|
||||
|
||||
temp_dst = false;
|
||||
|
||||
|
||||
if( flags & CV_DXT_ROWS && (bits&1024) )
|
||||
{
|
||||
if( bits&16 )
|
||||
@@ -553,7 +553,7 @@ void CxCore_DXTBaseTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
size.height = 1;
|
||||
flags &= ~CV_DXT_ROWS;
|
||||
}
|
||||
|
||||
|
||||
const int P2_MIN_SIZE = 32;
|
||||
if( ((bits >> 10) & 1) == 0 )
|
||||
{
|
||||
@@ -562,19 +562,19 @@ void CxCore_DXTBaseTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
size.height = (size.height / P2_MIN_SIZE)*P2_MIN_SIZE;
|
||||
size.height = MAX(size.height, 1);
|
||||
}
|
||||
|
||||
|
||||
if( !allow_odd )
|
||||
{
|
||||
if( size.width > 1 && (size.width&1) != 0 )
|
||||
size.width = (size.width + 1) & -2;
|
||||
|
||||
|
||||
if( size.height > 1 && (size.height&1) != 0 && !(flags & CV_DXT_ROWS) )
|
||||
size.height = (size.height + 1) & -2;
|
||||
}
|
||||
|
||||
|
||||
sizes[INPUT][0] = sizes[OUTPUT][0] = size;
|
||||
sizes[TEMP][0] = sizes[TEMP][1] = cvSize(0,0);
|
||||
|
||||
|
||||
if( spectrum_mode )
|
||||
{
|
||||
if( cn == 1 )
|
||||
@@ -590,7 +590,7 @@ void CxCore_DXTBaseTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
types[TEMP][0] = depth + 8; // CV_??FC2
|
||||
sizes[TEMP][0] = size;
|
||||
size = cvSize(size.width/2+1, size.height);
|
||||
|
||||
|
||||
if( flags & CV_DXT_INVERSE )
|
||||
{
|
||||
if( cn == 2 )
|
||||
@@ -605,7 +605,7 @@ void CxCore_DXTBaseTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
{
|
||||
if( allow_complex )
|
||||
types[OUTPUT][0] = depth + 8;
|
||||
|
||||
|
||||
if( cn == 2 )
|
||||
{
|
||||
types[INPUT][0] = depth;
|
||||
@@ -620,13 +620,13 @@ void CxCore_DXTBaseTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
temp_dst = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inplace = false;
|
||||
if( spectrum_mode ||
|
||||
(!temp_dst && types[INPUT][0] == types[OUTPUT][0]) ||
|
||||
(temp_dst && types[INPUT][0] == types[TEMP][1]) )
|
||||
inplace = (bits & 64) != 0;
|
||||
|
||||
|
||||
types[REF_OUTPUT][0] = types[OUTPUT][0];
|
||||
sizes[REF_OUTPUT][0] = sizes[OUTPUT][0];
|
||||
}
|
||||
@@ -645,17 +645,17 @@ int CxCore_DXTBaseTest::prepare_test_case( int test_case_idx )
|
||||
{
|
||||
int in_type = test_mat[INPUT][0].type();
|
||||
int out_type = test_mat[OUTPUT][0].type();
|
||||
|
||||
|
||||
if( CV_MAT_CN(in_type) == 2 && CV_MAT_CN(out_type) == 1 )
|
||||
cvtest::fixCCS( test_mat[INPUT][0], test_mat[OUTPUT][0].cols, flags );
|
||||
|
||||
|
||||
if( inplace )
|
||||
cvtest::copy( test_mat[INPUT][test_case_idx & (int)spectrum_mode],
|
||||
temp_dst ? test_mat[TEMP][1] :
|
||||
in_type == out_type ? test_mat[OUTPUT][0] :
|
||||
test_mat[TEMP][0] );
|
||||
}
|
||||
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
@@ -680,7 +680,7 @@ void CxCore_DFTTest::run_func()
|
||||
{
|
||||
Mat& dst = temp_dst ? test_mat[TEMP][1] : test_mat[OUTPUT][0];
|
||||
const Mat& src = inplace ? dst : test_mat[INPUT][0];
|
||||
|
||||
|
||||
if(!(flags & CV_DXT_INVERSE))
|
||||
cv::dft( src, dst, flags );
|
||||
else
|
||||
@@ -696,11 +696,11 @@ void CxCore_DFTTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
Mat* tmp_dst = &dst;
|
||||
int src_cn = src.channels();
|
||||
int dst_cn = dst.channels();
|
||||
|
||||
|
||||
if( src_cn != 2 || dst_cn != 2 )
|
||||
{
|
||||
tmp_src = &test_mat[TEMP][0];
|
||||
|
||||
|
||||
if( !(flags & CV_DXT_INVERSE ) )
|
||||
{
|
||||
Mat& cvdft_dst = test_mat[TEMP][1];
|
||||
@@ -715,12 +715,12 @@ void CxCore_DFTTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
tmp_dst = &test_mat[TEMP][1];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( src.rows == 1 || (src.cols == 1 && !(flags & CV_DXT_ROWS)) )
|
||||
cvtest::DFT_1D( *tmp_src, *tmp_dst, flags );
|
||||
else
|
||||
cvtest::DFT_2D( *tmp_src, *tmp_dst, flags );
|
||||
|
||||
|
||||
if( tmp_dst != &dst )
|
||||
cvtest::extract( *tmp_dst, dst, 0 );
|
||||
}
|
||||
@@ -745,7 +745,7 @@ void CxCore_DCTTest::run_func()
|
||||
{
|
||||
Mat& dst = test_mat[OUTPUT][0];
|
||||
const Mat& src = inplace ? dst : test_mat[INPUT][0];
|
||||
|
||||
|
||||
if(!(flags & CV_DXT_INVERSE))
|
||||
cv::dct( src, dst, flags );
|
||||
else
|
||||
@@ -757,7 +757,7 @@ void CxCore_DCTTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
{
|
||||
const Mat& src = test_mat[INPUT][0];
|
||||
Mat& dst = test_mat[REF_OUTPUT][0];
|
||||
|
||||
|
||||
if( src.rows == 1 || (src.cols == 1 && !(flags & CV_DXT_ROWS)) )
|
||||
cvtest::DCT_1D( src, dst, flags );
|
||||
else
|
||||
@@ -786,7 +786,7 @@ void CxCore_MulSpectrumsTest::run_func()
|
||||
Mat& dst = !test_mat[TEMP].empty() && !test_mat[TEMP][0].empty() ?
|
||||
test_mat[TEMP][0] : test_mat[OUTPUT][0];
|
||||
const Mat* src1 = &test_mat[INPUT][0], *src2 = &test_mat[INPUT][1];
|
||||
|
||||
|
||||
if( inplace )
|
||||
{
|
||||
if( ts->get_current_test_info()->test_case_idx & 1 )
|
||||
@@ -794,7 +794,7 @@ void CxCore_MulSpectrumsTest::run_func()
|
||||
else
|
||||
src1 = &dst;
|
||||
}
|
||||
|
||||
|
||||
cv::mulSpectrums( *src1, *src2, dst, flags, (flags & CV_DXT_MUL_CONJ) != 0 );
|
||||
}
|
||||
|
||||
@@ -806,7 +806,7 @@ void CxCore_MulSpectrumsTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
Mat& dst = test_mat[OUTPUT][0];
|
||||
Mat& dst0 = test_mat[REF_OUTPUT][0];
|
||||
int cn = src1->channels();
|
||||
|
||||
|
||||
if( cn == 1 )
|
||||
{
|
||||
cvtest::convertFromCCS( *src1, *src1, dst, flags );
|
||||
@@ -814,7 +814,7 @@ void CxCore_MulSpectrumsTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
src1 = &dst;
|
||||
src2 = &dst0;
|
||||
}
|
||||
|
||||
|
||||
cvtest::mulComplex( *src1, *src2, dst0, flags );
|
||||
if( cn == 1 )
|
||||
{
|
||||
|
@@ -1,411 +1,411 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's 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.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
#include <time.h>
|
||||
|
||||
using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
#define sign(a) a > 0 ? 1 : a == 0 ? 0 : -1
|
||||
|
||||
#define CORE_EIGEN_ERROR_COUNT 1
|
||||
#define CORE_EIGEN_ERROR_SIZE 2
|
||||
#define CORE_EIGEN_ERROR_DIFF 3
|
||||
#define CORE_EIGEN_ERROR_ORTHO 4
|
||||
#define CORE_EIGEN_ERROR_ORDER 5
|
||||
|
||||
#define MESSAGE_ERROR_COUNT "Matrix of eigen values must have the same rows as source matrix and 1 column."
|
||||
#define MESSAGE_ERROR_SIZE "Source matrix and matrix of eigen vectors must have the same sizes."
|
||||
#define MESSAGE_ERROR_DIFF_1 "Accurasy of eigen values computing less than required."
|
||||
#define MESSAGE_ERROR_DIFF_2 "Accuracy of eigen vectors computing less than required."
|
||||
#define MESSAGE_ERROR_ORTHO "Matrix of eigen vectors is not orthogonal."
|
||||
#define MESSAGE_ERROR_ORDER "Eigen values are not sorted in ascending order."
|
||||
|
||||
const int COUNT_NORM_TYPES = 3;
|
||||
const int NORM_TYPE[COUNT_NORM_TYPES] = {cv::NORM_L1, cv::NORM_L2, cv::NORM_INF};
|
||||
|
||||
enum TASK_TYPE_EIGEN {VALUES, VECTORS};
|
||||
|
||||
class Core_EigenTest: public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
|
||||
Core_EigenTest();
|
||||
~Core_EigenTest();
|
||||
|
||||
protected:
|
||||
|
||||
bool test_values(const cv::Mat& src); // complex test for eigen without vectors
|
||||
bool check_full(int type); // compex test for symmetric matrix
|
||||
virtual void run (int) = 0; // main testing method
|
||||
|
||||
protected:
|
||||
|
||||
float eps_val_32, eps_vec_32;
|
||||
float eps_val_64, eps_vec_64;
|
||||
int ntests;
|
||||
|
||||
bool check_pair_count(const cv::Mat& src, const cv::Mat& evalues, int low_index = -1, int high_index = -1);
|
||||
bool check_pair_count(const cv::Mat& src, const cv::Mat& evalues, const cv::Mat& evectors, int low_index = -1, int high_index = -1);
|
||||
bool check_pairs_order(const cv::Mat& eigen_values); // checking order of eigen values & vectors (it should be none up)
|
||||
bool check_orthogonality(const cv::Mat& U); // checking is matrix of eigen vectors orthogonal
|
||||
bool test_pairs(const cv::Mat& src); // complex test for eigen with vectors
|
||||
|
||||
void print_information(const size_t norm_idx, const cv::Mat& src, double diff, double max_diff);
|
||||
};
|
||||
|
||||
class Core_EigenTest_Scalar : public Core_EigenTest
|
||||
{
|
||||
public:
|
||||
Core_EigenTest_Scalar() : Core_EigenTest() {}
|
||||
~Core_EigenTest_Scalar();
|
||||
|
||||
virtual void run(int) = 0;
|
||||
};
|
||||
|
||||
class Core_EigenTest_Scalar_32 : public Core_EigenTest_Scalar
|
||||
{
|
||||
public:
|
||||
Core_EigenTest_Scalar_32() : Core_EigenTest_Scalar() {}
|
||||
~Core_EigenTest_Scalar_32();
|
||||
|
||||
void run(int);
|
||||
};
|
||||
|
||||
class Core_EigenTest_Scalar_64 : public Core_EigenTest_Scalar
|
||||
{
|
||||
public:
|
||||
Core_EigenTest_Scalar_64() : Core_EigenTest_Scalar() {}
|
||||
~Core_EigenTest_Scalar_64();
|
||||
void run(int);
|
||||
};
|
||||
|
||||
class Core_EigenTest_32 : public Core_EigenTest
|
||||
{
|
||||
public:
|
||||
Core_EigenTest_32(): Core_EigenTest() {}
|
||||
~Core_EigenTest_32() {}
|
||||
void run(int);
|
||||
};
|
||||
|
||||
class Core_EigenTest_64 : public Core_EigenTest
|
||||
{
|
||||
public:
|
||||
Core_EigenTest_64(): Core_EigenTest() {}
|
||||
~Core_EigenTest_64() {}
|
||||
void run(int);
|
||||
};
|
||||
|
||||
Core_EigenTest_Scalar::~Core_EigenTest_Scalar() {}
|
||||
Core_EigenTest_Scalar_32::~Core_EigenTest_Scalar_32() {}
|
||||
Core_EigenTest_Scalar_64::~Core_EigenTest_Scalar_64() {}
|
||||
|
||||
void Core_EigenTest_Scalar_32::run(int)
|
||||
{
|
||||
for (int i = 0; i < ntests; ++i)
|
||||
{
|
||||
float value = cv::randu<float>();
|
||||
cv::Mat src(1, 1, CV_32FC1, Scalar::all((float)value));
|
||||
test_values(src);
|
||||
}
|
||||
}
|
||||
|
||||
void Core_EigenTest_Scalar_64::run(int)
|
||||
{
|
||||
for (int i = 0; i < ntests; ++i)
|
||||
{
|
||||
float value = cv::randu<float>();
|
||||
cv::Mat src(1, 1, CV_64FC1, Scalar::all((double)value));
|
||||
test_values(src);
|
||||
}
|
||||
}
|
||||
|
||||
void Core_EigenTest_32::run(int) { check_full(CV_32FC1); }
|
||||
void Core_EigenTest_64::run(int) { check_full(CV_64FC1); }
|
||||
|
||||
Core_EigenTest::Core_EigenTest()
|
||||
: eps_val_32(1e-3f), eps_vec_32(1e-2f),
|
||||
eps_val_64(1e-4f), eps_vec_64(1e-3f), ntests(100) {}
|
||||
Core_EigenTest::~Core_EigenTest() {}
|
||||
|
||||
bool Core_EigenTest::check_pair_count(const cv::Mat& src, const cv::Mat& evalues, int low_index, int high_index)
|
||||
{
|
||||
int n = src.rows, s = sign(high_index);
|
||||
if (!( (evalues.rows == n - max<int>(0, low_index) - ((int)((n/2.0)*(s*s-s)) + (1+s-s*s)*(n - (high_index+1)))) && (evalues.cols == 1)))
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking sizes of eigen values matrix " << evalues << "..." << endl;
|
||||
std::cout << "Number of rows: " << evalues.rows << " Number of cols: " << evalues.cols << endl;
|
||||
std:: cout << "Size of src symmetric matrix: " << src.rows << " * " << src.cols << endl; std::cout << endl;
|
||||
CV_Error(CORE_EIGEN_ERROR_COUNT, MESSAGE_ERROR_COUNT);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::check_pair_count(const cv::Mat& src, const cv::Mat& evalues, const cv::Mat& evectors, int low_index, int high_index)
|
||||
{
|
||||
int n = src.rows, s = sign(high_index);
|
||||
int right_eigen_pair_count = n - max<int>(0, low_index) - ((int)((n/2.0)*(s*s-s)) + (1+s-s*s)*(n - (high_index+1)));
|
||||
|
||||
if (!((evectors.rows == right_eigen_pair_count) && (evectors.cols == right_eigen_pair_count)))
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking sizes of eigen vectors matrix " << evectors << "..." << endl;
|
||||
std::cout << "Number of rows: " << evectors.rows << " Number of cols: " << evectors.cols << endl;
|
||||
std:: cout << "Size of src symmetric matrix: " << src.rows << " * " << src.cols << endl; std::cout << endl;
|
||||
CV_Error (CORE_EIGEN_ERROR_SIZE, MESSAGE_ERROR_SIZE);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!((evalues.rows == right_eigen_pair_count) && (evalues.cols == 1)))
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking sizes of eigen values matrix " << evalues << "..." << endl;
|
||||
std::cout << "Number of rows: " << evalues.rows << " Number of cols: " << evalues.cols << endl;
|
||||
std:: cout << "Size of src symmetric matrix: " << src.rows << " * " << src.cols << endl; std::cout << endl;
|
||||
CV_Error (CORE_EIGEN_ERROR_COUNT, MESSAGE_ERROR_COUNT);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Core_EigenTest::print_information(const size_t norm_idx, const cv::Mat& src, double diff, double max_diff)
|
||||
{
|
||||
switch (NORM_TYPE[norm_idx])
|
||||
{
|
||||
case cv::NORM_L1: {std::cout << "L1"; break;}
|
||||
case cv::NORM_L2: {std::cout << "L2"; break;}
|
||||
case cv::NORM_INF: {std::cout << "INF"; break;}
|
||||
default: break;
|
||||
}
|
||||
|
||||
cout << "-criteria... " << endl;
|
||||
cout << "Source size: " << src.rows << " * " << src.cols << endl;
|
||||
cout << "Difference between original eigen vectors matrix and result: " << diff << endl;
|
||||
cout << "Maximum allowed difference: " << max_diff << endl; cout << endl;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::check_orthogonality(const cv::Mat& U)
|
||||
{
|
||||
int type = U.type();
|
||||
double eps_vec = type == CV_32FC1 ? eps_vec_32 : eps_vec_64;
|
||||
cv::Mat UUt; cv::mulTransposed(U, UUt, false);
|
||||
|
||||
cv::Mat E = Mat::eye(U.rows, U.cols, type);
|
||||
|
||||
for (int i = 0; i < COUNT_NORM_TYPES; ++i)
|
||||
{
|
||||
double diff = cv::norm(UUt, E, NORM_TYPE[i]);
|
||||
if (diff > eps_vec)
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking orthogonality of matrix " << U << ": ";
|
||||
print_information(i, U, diff, eps_vec);
|
||||
CV_Error(CORE_EIGEN_ERROR_ORTHO, MESSAGE_ERROR_ORTHO);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::check_pairs_order(const cv::Mat& eigen_values)
|
||||
{
|
||||
switch (eigen_values.type())
|
||||
{
|
||||
case CV_32FC1:
|
||||
{
|
||||
for (int i = 0; i < (int)(eigen_values.total() - 1); ++i)
|
||||
if (!(eigen_values.at<float>(i, 0) > eigen_values.at<float>(i+1, 0)))
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking order of eigen values vector " << eigen_values << "..." << endl;
|
||||
std::cout << "Pair of indexes with non ascending of eigen values: (" << i << ", " << i+1 << ")." << endl;
|
||||
std::cout << endl;
|
||||
CV_Error(CORE_EIGEN_ERROR_ORDER, MESSAGE_ERROR_ORDER);
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case CV_64FC1:
|
||||
{
|
||||
for (int i = 0; i < (int)(eigen_values.total() - 1); ++i)
|
||||
if (!(eigen_values.at<double>(i, 0) > eigen_values.at<double>(i+1, 0)))
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking order of eigen values vector " << eigen_values << "..." << endl;
|
||||
std::cout << "Pair of indexes with non ascending of eigen values: (" << i << ", " << i+1 << ")." << endl;
|
||||
std::cout << endl;
|
||||
CV_Error(CORE_EIGEN_ERROR_ORDER, "Eigen values are not sorted in ascending order.");
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::test_pairs(const cv::Mat& src)
|
||||
{
|
||||
int type = src.type();
|
||||
double eps_vec = type == CV_32FC1 ? eps_vec_32 : eps_vec_64;
|
||||
|
||||
cv::Mat eigen_values, eigen_vectors;
|
||||
|
||||
cv::eigen(src, true, eigen_values, eigen_vectors);
|
||||
|
||||
if (!check_pair_count(src, eigen_values, eigen_vectors)) return false;
|
||||
|
||||
if (!check_orthogonality (eigen_vectors)) return false;
|
||||
|
||||
if (!check_pairs_order(eigen_values)) return false;
|
||||
|
||||
cv::Mat eigen_vectors_t; cv::transpose(eigen_vectors, eigen_vectors_t);
|
||||
|
||||
cv::Mat src_evec(src.rows, src.cols, type);
|
||||
src_evec = src*eigen_vectors_t;
|
||||
|
||||
cv::Mat eval_evec(src.rows, src.cols, type);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case CV_32FC1:
|
||||
{
|
||||
for (int i = 0; i < src.cols; ++i)
|
||||
{
|
||||
cv::Mat tmp = eigen_values.at<float>(i, 0) * eigen_vectors_t.col(i);
|
||||
for (int j = 0; j < src.rows; ++j) eval_evec.at<float>(j, i) = tmp.at<float>(j, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case CV_64FC1:
|
||||
{
|
||||
for (int i = 0; i < src.cols; ++i)
|
||||
{
|
||||
cv::Mat tmp = eigen_values.at<double>(i, 0) * eigen_vectors_t.col(i);
|
||||
for (int j = 0; j < src.rows; ++j) eval_evec.at<double>(j, i) = tmp.at<double>(j, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:;
|
||||
}
|
||||
|
||||
cv::Mat disparity = src_evec - eval_evec;
|
||||
|
||||
for (int i = 0; i < COUNT_NORM_TYPES; ++i)
|
||||
{
|
||||
double diff = cv::norm(disparity, NORM_TYPE[i]);
|
||||
if (diff > eps_vec)
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking accuracy of eigen vectors computing for matrix " << src << ": ";
|
||||
print_information(i, src, diff, eps_vec);
|
||||
CV_Error(CORE_EIGEN_ERROR_DIFF, MESSAGE_ERROR_DIFF_2);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::test_values(const cv::Mat& src)
|
||||
{
|
||||
int type = src.type();
|
||||
double eps_val = type == CV_32FC1 ? eps_val_32 : eps_val_64;
|
||||
|
||||
cv::Mat eigen_values_1, eigen_values_2, eigen_vectors;
|
||||
|
||||
if (!test_pairs(src)) return false;
|
||||
|
||||
cv::eigen(src, true, eigen_values_1, eigen_vectors);
|
||||
cv::eigen(src, false, eigen_values_2, eigen_vectors);
|
||||
|
||||
if (!check_pair_count(src, eigen_values_2)) return false;
|
||||
|
||||
for (int i = 0; i < COUNT_NORM_TYPES; ++i)
|
||||
{
|
||||
double diff = cv::norm(eigen_values_1, eigen_values_2, NORM_TYPE[i]);
|
||||
if (diff > eps_val)
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking accuracy of eigen values computing for matrix " << src << ": ";
|
||||
print_information(i, src, diff, eps_val);
|
||||
CV_Error(CORE_EIGEN_ERROR_DIFF, MESSAGE_ERROR_DIFF_1);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::check_full(int type)
|
||||
{
|
||||
const int MAX_DEGREE = 7;
|
||||
|
||||
srand((unsigned int)time(0));
|
||||
|
||||
for (int i = 0; i < ntests; ++i)
|
||||
{
|
||||
int src_size = (int)(std::pow(2.0, (rand()%MAX_DEGREE)+1.));
|
||||
|
||||
cv::Mat src(src_size, src_size, type);
|
||||
|
||||
for (int j = 0; j < src.rows; ++j)
|
||||
for (int k = j; k < src.cols; ++k)
|
||||
if (type == CV_32FC1) src.at<float>(k, j) = src.at<float>(j, k) = cv::randu<float>();
|
||||
else src.at<double>(k, j) = src.at<double>(j, k) = cv::randu<double>();
|
||||
|
||||
if (!test_values(src)) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
TEST(Core_Eigen, scalar_32) {Core_EigenTest_Scalar_32 test; test.safe_run(); }
|
||||
TEST(Core_Eigen, scalar_64) {Core_EigenTest_Scalar_64 test; test.safe_run(); }
|
||||
TEST(Core_Eigen, vector_32) { Core_EigenTest_32 test; test.safe_run(); }
|
||||
TEST(Core_Eigen, vector_64) { Core_EigenTest_64 test; test.safe_run(); }
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's 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.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
#include <time.h>
|
||||
|
||||
using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
#define sign(a) a > 0 ? 1 : a == 0 ? 0 : -1
|
||||
|
||||
#define CORE_EIGEN_ERROR_COUNT 1
|
||||
#define CORE_EIGEN_ERROR_SIZE 2
|
||||
#define CORE_EIGEN_ERROR_DIFF 3
|
||||
#define CORE_EIGEN_ERROR_ORTHO 4
|
||||
#define CORE_EIGEN_ERROR_ORDER 5
|
||||
|
||||
#define MESSAGE_ERROR_COUNT "Matrix of eigen values must have the same rows as source matrix and 1 column."
|
||||
#define MESSAGE_ERROR_SIZE "Source matrix and matrix of eigen vectors must have the same sizes."
|
||||
#define MESSAGE_ERROR_DIFF_1 "Accurasy of eigen values computing less than required."
|
||||
#define MESSAGE_ERROR_DIFF_2 "Accuracy of eigen vectors computing less than required."
|
||||
#define MESSAGE_ERROR_ORTHO "Matrix of eigen vectors is not orthogonal."
|
||||
#define MESSAGE_ERROR_ORDER "Eigen values are not sorted in ascending order."
|
||||
|
||||
const int COUNT_NORM_TYPES = 3;
|
||||
const int NORM_TYPE[COUNT_NORM_TYPES] = {cv::NORM_L1, cv::NORM_L2, cv::NORM_INF};
|
||||
|
||||
enum TASK_TYPE_EIGEN {VALUES, VECTORS};
|
||||
|
||||
class Core_EigenTest: public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
|
||||
Core_EigenTest();
|
||||
~Core_EigenTest();
|
||||
|
||||
protected:
|
||||
|
||||
bool test_values(const cv::Mat& src); // complex test for eigen without vectors
|
||||
bool check_full(int type); // compex test for symmetric matrix
|
||||
virtual void run (int) = 0; // main testing method
|
||||
|
||||
protected:
|
||||
|
||||
float eps_val_32, eps_vec_32;
|
||||
float eps_val_64, eps_vec_64;
|
||||
int ntests;
|
||||
|
||||
bool check_pair_count(const cv::Mat& src, const cv::Mat& evalues, int low_index = -1, int high_index = -1);
|
||||
bool check_pair_count(const cv::Mat& src, const cv::Mat& evalues, const cv::Mat& evectors, int low_index = -1, int high_index = -1);
|
||||
bool check_pairs_order(const cv::Mat& eigen_values); // checking order of eigen values & vectors (it should be none up)
|
||||
bool check_orthogonality(const cv::Mat& U); // checking is matrix of eigen vectors orthogonal
|
||||
bool test_pairs(const cv::Mat& src); // complex test for eigen with vectors
|
||||
|
||||
void print_information(const size_t norm_idx, const cv::Mat& src, double diff, double max_diff);
|
||||
};
|
||||
|
||||
class Core_EigenTest_Scalar : public Core_EigenTest
|
||||
{
|
||||
public:
|
||||
Core_EigenTest_Scalar() : Core_EigenTest() {}
|
||||
~Core_EigenTest_Scalar();
|
||||
|
||||
virtual void run(int) = 0;
|
||||
};
|
||||
|
||||
class Core_EigenTest_Scalar_32 : public Core_EigenTest_Scalar
|
||||
{
|
||||
public:
|
||||
Core_EigenTest_Scalar_32() : Core_EigenTest_Scalar() {}
|
||||
~Core_EigenTest_Scalar_32();
|
||||
|
||||
void run(int);
|
||||
};
|
||||
|
||||
class Core_EigenTest_Scalar_64 : public Core_EigenTest_Scalar
|
||||
{
|
||||
public:
|
||||
Core_EigenTest_Scalar_64() : Core_EigenTest_Scalar() {}
|
||||
~Core_EigenTest_Scalar_64();
|
||||
void run(int);
|
||||
};
|
||||
|
||||
class Core_EigenTest_32 : public Core_EigenTest
|
||||
{
|
||||
public:
|
||||
Core_EigenTest_32(): Core_EigenTest() {}
|
||||
~Core_EigenTest_32() {}
|
||||
void run(int);
|
||||
};
|
||||
|
||||
class Core_EigenTest_64 : public Core_EigenTest
|
||||
{
|
||||
public:
|
||||
Core_EigenTest_64(): Core_EigenTest() {}
|
||||
~Core_EigenTest_64() {}
|
||||
void run(int);
|
||||
};
|
||||
|
||||
Core_EigenTest_Scalar::~Core_EigenTest_Scalar() {}
|
||||
Core_EigenTest_Scalar_32::~Core_EigenTest_Scalar_32() {}
|
||||
Core_EigenTest_Scalar_64::~Core_EigenTest_Scalar_64() {}
|
||||
|
||||
void Core_EigenTest_Scalar_32::run(int)
|
||||
{
|
||||
for (int i = 0; i < ntests; ++i)
|
||||
{
|
||||
float value = cv::randu<float>();
|
||||
cv::Mat src(1, 1, CV_32FC1, Scalar::all((float)value));
|
||||
test_values(src);
|
||||
}
|
||||
}
|
||||
|
||||
void Core_EigenTest_Scalar_64::run(int)
|
||||
{
|
||||
for (int i = 0; i < ntests; ++i)
|
||||
{
|
||||
float value = cv::randu<float>();
|
||||
cv::Mat src(1, 1, CV_64FC1, Scalar::all((double)value));
|
||||
test_values(src);
|
||||
}
|
||||
}
|
||||
|
||||
void Core_EigenTest_32::run(int) { check_full(CV_32FC1); }
|
||||
void Core_EigenTest_64::run(int) { check_full(CV_64FC1); }
|
||||
|
||||
Core_EigenTest::Core_EigenTest()
|
||||
: eps_val_32(1e-3f), eps_vec_32(1e-2f),
|
||||
eps_val_64(1e-4f), eps_vec_64(1e-3f), ntests(100) {}
|
||||
Core_EigenTest::~Core_EigenTest() {}
|
||||
|
||||
bool Core_EigenTest::check_pair_count(const cv::Mat& src, const cv::Mat& evalues, int low_index, int high_index)
|
||||
{
|
||||
int n = src.rows, s = sign(high_index);
|
||||
if (!( (evalues.rows == n - max<int>(0, low_index) - ((int)((n/2.0)*(s*s-s)) + (1+s-s*s)*(n - (high_index+1)))) && (evalues.cols == 1)))
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking sizes of eigen values matrix " << evalues << "..." << endl;
|
||||
std::cout << "Number of rows: " << evalues.rows << " Number of cols: " << evalues.cols << endl;
|
||||
std:: cout << "Size of src symmetric matrix: " << src.rows << " * " << src.cols << endl; std::cout << endl;
|
||||
CV_Error(CORE_EIGEN_ERROR_COUNT, MESSAGE_ERROR_COUNT);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::check_pair_count(const cv::Mat& src, const cv::Mat& evalues, const cv::Mat& evectors, int low_index, int high_index)
|
||||
{
|
||||
int n = src.rows, s = sign(high_index);
|
||||
int right_eigen_pair_count = n - max<int>(0, low_index) - ((int)((n/2.0)*(s*s-s)) + (1+s-s*s)*(n - (high_index+1)));
|
||||
|
||||
if (!((evectors.rows == right_eigen_pair_count) && (evectors.cols == right_eigen_pair_count)))
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking sizes of eigen vectors matrix " << evectors << "..." << endl;
|
||||
std::cout << "Number of rows: " << evectors.rows << " Number of cols: " << evectors.cols << endl;
|
||||
std:: cout << "Size of src symmetric matrix: " << src.rows << " * " << src.cols << endl; std::cout << endl;
|
||||
CV_Error (CORE_EIGEN_ERROR_SIZE, MESSAGE_ERROR_SIZE);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!((evalues.rows == right_eigen_pair_count) && (evalues.cols == 1)))
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking sizes of eigen values matrix " << evalues << "..." << endl;
|
||||
std::cout << "Number of rows: " << evalues.rows << " Number of cols: " << evalues.cols << endl;
|
||||
std:: cout << "Size of src symmetric matrix: " << src.rows << " * " << src.cols << endl; std::cout << endl;
|
||||
CV_Error (CORE_EIGEN_ERROR_COUNT, MESSAGE_ERROR_COUNT);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Core_EigenTest::print_information(const size_t norm_idx, const cv::Mat& src, double diff, double max_diff)
|
||||
{
|
||||
switch (NORM_TYPE[norm_idx])
|
||||
{
|
||||
case cv::NORM_L1: {std::cout << "L1"; break;}
|
||||
case cv::NORM_L2: {std::cout << "L2"; break;}
|
||||
case cv::NORM_INF: {std::cout << "INF"; break;}
|
||||
default: break;
|
||||
}
|
||||
|
||||
cout << "-criteria... " << endl;
|
||||
cout << "Source size: " << src.rows << " * " << src.cols << endl;
|
||||
cout << "Difference between original eigen vectors matrix and result: " << diff << endl;
|
||||
cout << "Maximum allowed difference: " << max_diff << endl; cout << endl;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::check_orthogonality(const cv::Mat& U)
|
||||
{
|
||||
int type = U.type();
|
||||
double eps_vec = type == CV_32FC1 ? eps_vec_32 : eps_vec_64;
|
||||
cv::Mat UUt; cv::mulTransposed(U, UUt, false);
|
||||
|
||||
cv::Mat E = Mat::eye(U.rows, U.cols, type);
|
||||
|
||||
for (int i = 0; i < COUNT_NORM_TYPES; ++i)
|
||||
{
|
||||
double diff = cv::norm(UUt, E, NORM_TYPE[i]);
|
||||
if (diff > eps_vec)
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking orthogonality of matrix " << U << ": ";
|
||||
print_information(i, U, diff, eps_vec);
|
||||
CV_Error(CORE_EIGEN_ERROR_ORTHO, MESSAGE_ERROR_ORTHO);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::check_pairs_order(const cv::Mat& eigen_values)
|
||||
{
|
||||
switch (eigen_values.type())
|
||||
{
|
||||
case CV_32FC1:
|
||||
{
|
||||
for (int i = 0; i < (int)(eigen_values.total() - 1); ++i)
|
||||
if (!(eigen_values.at<float>(i, 0) > eigen_values.at<float>(i+1, 0)))
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking order of eigen values vector " << eigen_values << "..." << endl;
|
||||
std::cout << "Pair of indexes with non ascending of eigen values: (" << i << ", " << i+1 << ")." << endl;
|
||||
std::cout << endl;
|
||||
CV_Error(CORE_EIGEN_ERROR_ORDER, MESSAGE_ERROR_ORDER);
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case CV_64FC1:
|
||||
{
|
||||
for (int i = 0; i < (int)(eigen_values.total() - 1); ++i)
|
||||
if (!(eigen_values.at<double>(i, 0) > eigen_values.at<double>(i+1, 0)))
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking order of eigen values vector " << eigen_values << "..." << endl;
|
||||
std::cout << "Pair of indexes with non ascending of eigen values: (" << i << ", " << i+1 << ")." << endl;
|
||||
std::cout << endl;
|
||||
CV_Error(CORE_EIGEN_ERROR_ORDER, "Eigen values are not sorted in ascending order.");
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::test_pairs(const cv::Mat& src)
|
||||
{
|
||||
int type = src.type();
|
||||
double eps_vec = type == CV_32FC1 ? eps_vec_32 : eps_vec_64;
|
||||
|
||||
cv::Mat eigen_values, eigen_vectors;
|
||||
|
||||
cv::eigen(src, true, eigen_values, eigen_vectors);
|
||||
|
||||
if (!check_pair_count(src, eigen_values, eigen_vectors)) return false;
|
||||
|
||||
if (!check_orthogonality (eigen_vectors)) return false;
|
||||
|
||||
if (!check_pairs_order(eigen_values)) return false;
|
||||
|
||||
cv::Mat eigen_vectors_t; cv::transpose(eigen_vectors, eigen_vectors_t);
|
||||
|
||||
cv::Mat src_evec(src.rows, src.cols, type);
|
||||
src_evec = src*eigen_vectors_t;
|
||||
|
||||
cv::Mat eval_evec(src.rows, src.cols, type);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case CV_32FC1:
|
||||
{
|
||||
for (int i = 0; i < src.cols; ++i)
|
||||
{
|
||||
cv::Mat tmp = eigen_values.at<float>(i, 0) * eigen_vectors_t.col(i);
|
||||
for (int j = 0; j < src.rows; ++j) eval_evec.at<float>(j, i) = tmp.at<float>(j, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case CV_64FC1:
|
||||
{
|
||||
for (int i = 0; i < src.cols; ++i)
|
||||
{
|
||||
cv::Mat tmp = eigen_values.at<double>(i, 0) * eigen_vectors_t.col(i);
|
||||
for (int j = 0; j < src.rows; ++j) eval_evec.at<double>(j, i) = tmp.at<double>(j, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:;
|
||||
}
|
||||
|
||||
cv::Mat disparity = src_evec - eval_evec;
|
||||
|
||||
for (int i = 0; i < COUNT_NORM_TYPES; ++i)
|
||||
{
|
||||
double diff = cv::norm(disparity, NORM_TYPE[i]);
|
||||
if (diff > eps_vec)
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking accuracy of eigen vectors computing for matrix " << src << ": ";
|
||||
print_information(i, src, diff, eps_vec);
|
||||
CV_Error(CORE_EIGEN_ERROR_DIFF, MESSAGE_ERROR_DIFF_2);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::test_values(const cv::Mat& src)
|
||||
{
|
||||
int type = src.type();
|
||||
double eps_val = type == CV_32FC1 ? eps_val_32 : eps_val_64;
|
||||
|
||||
cv::Mat eigen_values_1, eigen_values_2, eigen_vectors;
|
||||
|
||||
if (!test_pairs(src)) return false;
|
||||
|
||||
cv::eigen(src, true, eigen_values_1, eigen_vectors);
|
||||
cv::eigen(src, false, eigen_values_2, eigen_vectors);
|
||||
|
||||
if (!check_pair_count(src, eigen_values_2)) return false;
|
||||
|
||||
for (int i = 0; i < COUNT_NORM_TYPES; ++i)
|
||||
{
|
||||
double diff = cv::norm(eigen_values_1, eigen_values_2, NORM_TYPE[i]);
|
||||
if (diff > eps_val)
|
||||
{
|
||||
std::cout << endl; std::cout << "Checking accuracy of eigen values computing for matrix " << src << ": ";
|
||||
print_information(i, src, diff, eps_val);
|
||||
CV_Error(CORE_EIGEN_ERROR_DIFF, MESSAGE_ERROR_DIFF_1);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core_EigenTest::check_full(int type)
|
||||
{
|
||||
const int MAX_DEGREE = 7;
|
||||
|
||||
srand((unsigned int)time(0));
|
||||
|
||||
for (int i = 0; i < ntests; ++i)
|
||||
{
|
||||
int src_size = (int)(std::pow(2.0, (rand()%MAX_DEGREE)+1.));
|
||||
|
||||
cv::Mat src(src_size, src_size, type);
|
||||
|
||||
for (int j = 0; j < src.rows; ++j)
|
||||
for (int k = j; k < src.cols; ++k)
|
||||
if (type == CV_32FC1) src.at<float>(k, j) = src.at<float>(j, k) = cv::randu<float>();
|
||||
else src.at<double>(k, j) = src.at<double>(j, k) = cv::randu<double>();
|
||||
|
||||
if (!test_values(src)) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
TEST(Core_Eigen, scalar_32) {Core_EigenTest_Scalar_32 test; test.safe_run(); }
|
||||
TEST(Core_Eigen, scalar_64) {Core_EigenTest_Scalar_64 test; test.safe_run(); }
|
||||
TEST(Core_Eigen, vector_32) { Core_EigenTest_32 test; test.safe_run(); }
|
||||
TEST(Core_Eigen, vector_64) { Core_EigenTest_64 test; test.safe_run(); }
|
||||
|
@@ -424,17 +424,17 @@ protected:
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 3. check C++ PCA w/retainedVariance
|
||||
cPCA( rPoints.t(), Mat(), CV_PCA_DATA_AS_COL, retainedVariance );
|
||||
diffPrjEps = 1, diffBackPrjEps = 1;
|
||||
Mat rvPrjTestPoints = cPCA.project(rTestPoints.t());
|
||||
|
||||
Mat rvPrjTestPoints = cPCA.project(rTestPoints.t());
|
||||
|
||||
if( cPCA.eigenvectors.rows > maxComponents)
|
||||
err = norm(cv::abs(rvPrjTestPoints.rowRange(0,maxComponents)), cv::abs(rPrjTestPoints.t()), CV_RELATIVE_L2 );
|
||||
else
|
||||
err = norm(cv::abs(rvPrjTestPoints), cv::abs(rPrjTestPoints.colRange(0,cPCA.eigenvectors.rows).t()), CV_RELATIVE_L2 );
|
||||
|
||||
|
||||
if( err > diffPrjEps )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "bad accuracy of project() (CV_PCA_DATA_AS_COL); retainedVariance=0.95; err = %f\n", err );
|
||||
@@ -448,7 +448,7 @@ protected:
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CHECK_C
|
||||
// 4. check C PCA & ROW
|
||||
_points = rPoints;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,42 +1,42 @@
|
||||
#include "test_precomp.hpp"
|
||||
|
||||
using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
TEST(Core_Drawing, _914)
|
||||
{
|
||||
const int rows = 256;
|
||||
const int cols = 256;
|
||||
|
||||
Mat img(rows, cols, CV_8UC1, Scalar(255));
|
||||
|
||||
line(img, Point(0, 10), Point(255, 10), Scalar(0), 2, 4);
|
||||
line(img, Point(-5, 20), Point(260, 20), Scalar(0), 2, 4);
|
||||
line(img, Point(10, 0), Point(10, 255), Scalar(0), 2, 4);
|
||||
|
||||
double x0 = 0.0/pow(2.0, -2.0);
|
||||
double x1 = 255.0/pow(2.0, -2.0);
|
||||
double y = 30.5/pow(2.0, -2.0);
|
||||
|
||||
line(img, Point(int(x0), int(y)), Point(int(x1), int(y)), Scalar(0), 2, 4, 2);
|
||||
|
||||
int pixelsDrawn = rows*cols - countNonZero(img);
|
||||
ASSERT_EQ( (3*rows + cols)*3 - 3*9, pixelsDrawn);
|
||||
}
|
||||
|
||||
|
||||
TEST(Core_OutputArraySreate, _1997)
|
||||
{
|
||||
struct local {
|
||||
static void create(OutputArray arr, Size submatSize, int type)
|
||||
{
|
||||
int sizes[] = {submatSize.width, submatSize.height};
|
||||
arr.create(sizeof(sizes)/sizeof(sizes[0]), sizes, type);
|
||||
}
|
||||
};
|
||||
|
||||
Mat mat(Size(512, 512), CV_8U);
|
||||
Size submatSize = Size(256, 256);
|
||||
|
||||
ASSERT_NO_THROW(local::create( mat(Rect(Point(), submatSize)), submatSize, mat.type() ));
|
||||
#include "test_precomp.hpp"
|
||||
|
||||
using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
TEST(Core_Drawing, _914)
|
||||
{
|
||||
const int rows = 256;
|
||||
const int cols = 256;
|
||||
|
||||
Mat img(rows, cols, CV_8UC1, Scalar(255));
|
||||
|
||||
line(img, Point(0, 10), Point(255, 10), Scalar(0), 2, 4);
|
||||
line(img, Point(-5, 20), Point(260, 20), Scalar(0), 2, 4);
|
||||
line(img, Point(10, 0), Point(10, 255), Scalar(0), 2, 4);
|
||||
|
||||
double x0 = 0.0/pow(2.0, -2.0);
|
||||
double x1 = 255.0/pow(2.0, -2.0);
|
||||
double y = 30.5/pow(2.0, -2.0);
|
||||
|
||||
line(img, Point(int(x0), int(y)), Point(int(x1), int(y)), Scalar(0), 2, 4, 2);
|
||||
|
||||
int pixelsDrawn = rows*cols - countNonZero(img);
|
||||
ASSERT_EQ( (3*rows + cols)*3 - 3*9, pixelsDrawn);
|
||||
}
|
||||
|
||||
|
||||
TEST(Core_OutputArraySreate, _1997)
|
||||
{
|
||||
struct local {
|
||||
static void create(OutputArray arr, Size submatSize, int type)
|
||||
{
|
||||
int sizes[] = {submatSize.width, submatSize.height};
|
||||
arr.create(sizeof(sizes)/sizeof(sizes[0]), sizes, type);
|
||||
}
|
||||
};
|
||||
|
||||
Mat mat(Size(512, 512), CV_8U);
|
||||
Size submatSize = Size(256, 256);
|
||||
|
||||
ASSERT_NO_THROW(local::create( mat(Rect(Point(), submatSize)), submatSize, mat.type() ));
|
||||
}
|
@@ -57,9 +57,9 @@ class CV_OperationsTest : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
CV_OperationsTest();
|
||||
~CV_OperationsTest();
|
||||
~CV_OperationsTest();
|
||||
protected:
|
||||
void run(int);
|
||||
void run(int);
|
||||
|
||||
struct test_excep
|
||||
{
|
||||
@@ -116,7 +116,7 @@ template<typename _Tp> void CV_OperationsTest::TestType(Size sz, _Tp value)
|
||||
for( int y = 0; y < sz.height; y++ )
|
||||
for( int x = 0; x < sz.width; x++ )
|
||||
m(y, x) = value;
|
||||
|
||||
|
||||
CV_Assert( sum(m.reshape(1,1))[0] == (double)sz.width*sz.height );
|
||||
}
|
||||
|
||||
@@ -131,8 +131,8 @@ bool CV_OperationsTest::TestMat()
|
||||
|
||||
float data[] = { sqrt(2.f)/2, -sqrt(2.f)/2, 1.f, sqrt(2.f)/2, sqrt(2.f)/2, 10.f };
|
||||
Mat rot_2x3(2, 3, CV_32F, data);
|
||||
|
||||
Mat res = one_3x1 + shi_3x1 + shi_3x1 + shi_3x1;
|
||||
|
||||
Mat res = one_3x1 + shi_3x1 + shi_3x1 + shi_3x1;
|
||||
res = Mat(Mat(2 * rot_2x3) * res - shi_2x1) + shift;
|
||||
|
||||
Mat tmp, res2;
|
||||
@@ -141,22 +141,22 @@ bool CV_OperationsTest::TestMat()
|
||||
add(tmp, shi_3x1, tmp);
|
||||
gemm(rot_2x3, tmp, 2, shi_2x1, -1, res2, 0);
|
||||
add(res2, Mat(2, 1, CV_32F, shift), res2);
|
||||
|
||||
|
||||
CHECK_DIFF(res, res2);
|
||||
|
||||
|
||||
Mat mat4x4(4, 4, CV_32F);
|
||||
randu(mat4x4, Scalar(0), Scalar(10));
|
||||
|
||||
Mat roi1 = mat4x4(Rect(Point(1, 1), Size(2, 2)));
|
||||
Mat roi2 = mat4x4(Range(1, 3), Range(1, 3));
|
||||
|
||||
|
||||
CHECK_DIFF(roi1, roi2);
|
||||
CHECK_DIFF(mat4x4, mat4x4(Rect(Point(0,0), mat4x4.size())));
|
||||
CHECK_DIFF(mat4x4, mat4x4(Rect(Point(0,0), mat4x4.size())));
|
||||
|
||||
Mat intMat10(3, 3, CV_32S, Scalar(10));
|
||||
Mat intMat11(3, 3, CV_32S, Scalar(11));
|
||||
Mat resMat(3, 3, CV_8U, Scalar(255));
|
||||
|
||||
|
||||
CHECK_DIFF(resMat, intMat10 == intMat10);
|
||||
CHECK_DIFF(resMat, intMat10 < intMat11);
|
||||
CHECK_DIFF(resMat, intMat11 > intMat10);
|
||||
@@ -183,7 +183,7 @@ bool CV_OperationsTest::TestMat()
|
||||
CHECK_DIFF(maskMat0, maskMat4 & maskMat1);
|
||||
CHECK_DIFF(maskMat0, Scalar(1) & maskMat4);
|
||||
CHECK_DIFF(maskMat0, maskMat4 & Scalar(1));
|
||||
|
||||
|
||||
Mat m;
|
||||
m = maskMat4.clone(); m &= maskMat1; CHECK_DIFF(maskMat0, m);
|
||||
m = maskMat4.clone(); m &= maskMat1 | maskMat1; CHECK_DIFF(maskMat0, m);
|
||||
@@ -198,14 +198,14 @@ bool CV_OperationsTest::TestMat()
|
||||
m = maskMat4.clone(); m |= Scalar(1); CHECK_DIFF(maskMat5, m);
|
||||
m = maskMat5.clone(); m ^= Scalar(1); CHECK_DIFF(maskMat4, m);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
CHECK_DIFF(maskMat0, (maskMat4 | maskMat4) & (maskMat1 | maskMat1));
|
||||
CHECK_DIFF(maskMat0, (maskMat4 | maskMat4) & maskMat1);
|
||||
CHECK_DIFF(maskMat0, maskMat4 & (maskMat1 | maskMat1));
|
||||
CHECK_DIFF(maskMat0, (maskMat1 | maskMat1) & Scalar(4));
|
||||
CHECK_DIFF(maskMat0, Scalar(4) & (maskMat1 | maskMat1));
|
||||
|
||||
|
||||
CHECK_DIFF(maskMat0, maskMat5 ^ (maskMat4 | maskMat1));
|
||||
CHECK_DIFF(maskMat0, (maskMat4 | maskMat1) ^ maskMat5);
|
||||
CHECK_DIFF(maskMat0, (maskMat4 + maskMat1) ^ (maskMat4 + maskMat1));
|
||||
@@ -216,7 +216,7 @@ bool CV_OperationsTest::TestMat()
|
||||
CHECK_DIFF(maskMat0, (maskMat4 + maskMat1) ^ Scalar(5));
|
||||
|
||||
CHECK_DIFF(maskMat5, maskMat5 | (maskMat4 ^ maskMat1));
|
||||
CHECK_DIFF(maskMat5, (maskMat4 ^ maskMat1) | maskMat5);
|
||||
CHECK_DIFF(maskMat5, (maskMat4 ^ maskMat1) | maskMat5);
|
||||
CHECK_DIFF(maskMat5, maskMat5 | (maskMat4 ^ Scalar(1)));
|
||||
CHECK_DIFF(maskMat5, (maskMat4 | maskMat4) | Scalar(1));
|
||||
CHECK_DIFF(maskMat5, Scalar(1) | (maskMat4 | maskMat4));
|
||||
@@ -234,9 +234,9 @@ bool CV_OperationsTest::TestMat()
|
||||
CHECK_DIFF(maskMat5, max(maskMat1, maskMat5 | maskMat5));
|
||||
|
||||
CHECK_DIFF(~maskMat1, maskMat1 ^ -1);
|
||||
CHECK_DIFF(~(maskMat1 | maskMat1), maskMat1 ^ -1);
|
||||
CHECK_DIFF(~(maskMat1 | maskMat1), maskMat1 ^ -1);
|
||||
|
||||
CHECK_DIFF(maskMat1, maskMat4/4.0);
|
||||
CHECK_DIFF(maskMat1, maskMat4/4.0);
|
||||
|
||||
/////////////////////////////
|
||||
|
||||
@@ -251,33 +251,33 @@ bool CV_OperationsTest::TestMat()
|
||||
CHECK_DIFF(5.0 - ((maskMat1 | maskMat1) * 1.0 + 3.0), maskMat1);
|
||||
CHECK_DIFF( ( (maskMat1 | maskMat1) * 2.0 + 2.0) * 1.25, maskMat5);
|
||||
CHECK_DIFF( 1.25 * ( (maskMat1 | maskMat1) * 2.0 + 2.0), maskMat5);
|
||||
CHECK_DIFF( -( (maskMat1 | maskMat1) * (-2.0) + 1.0), maskMat1);
|
||||
CHECK_DIFF( maskMat1 * 1.0 + maskMat4 * 0.5 + 2.0, maskMat5);
|
||||
CHECK_DIFF( 1.0 + (maskMat1 * 1.0 + maskMat4 * 0.5 + 1.0), maskMat5);
|
||||
CHECK_DIFF( (maskMat1 * 1.0 + maskMat4 * 0.5 + 2.0) - 1.0, maskMat4);
|
||||
CHECK_DIFF(5.0 - (maskMat1 * 1.0 + maskMat4 * 0.5 + 1.0), maskMat1);
|
||||
CHECK_DIFF((maskMat1 * 1.0 + maskMat4 * 0.5 + 1.0)*1.25, maskMat5);
|
||||
CHECK_DIFF(1.25 * (maskMat1 * 1.0 + maskMat4 * 0.5 + 1.0), maskMat5);
|
||||
CHECK_DIFF(-(maskMat1 * 2.0 + maskMat4 * (-1) + 1.0), maskMat1);
|
||||
CHECK_DIFF((maskMat1 * 1.0 + maskMat4), maskMat5);
|
||||
CHECK_DIFF((maskMat4 + maskMat1 * 1.0), maskMat5);
|
||||
CHECK_DIFF((maskMat1 * 3.0 + 1.0) + maskMat1, maskMat5);
|
||||
CHECK_DIFF(maskMat1 + (maskMat1 * 3.0 + 1.0), maskMat5);
|
||||
CHECK_DIFF(maskMat1*4.0 + (maskMat1 | maskMat1), maskMat5);
|
||||
CHECK_DIFF((maskMat1 | maskMat1) + maskMat1*4.0, maskMat5);
|
||||
CHECK_DIFF((maskMat1*3.0 + 1.0) + (maskMat1 | maskMat1), maskMat5);
|
||||
CHECK_DIFF( -( (maskMat1 | maskMat1) * (-2.0) + 1.0), maskMat1);
|
||||
CHECK_DIFF( maskMat1 * 1.0 + maskMat4 * 0.5 + 2.0, maskMat5);
|
||||
CHECK_DIFF( 1.0 + (maskMat1 * 1.0 + maskMat4 * 0.5 + 1.0), maskMat5);
|
||||
CHECK_DIFF( (maskMat1 * 1.0 + maskMat4 * 0.5 + 2.0) - 1.0, maskMat4);
|
||||
CHECK_DIFF(5.0 - (maskMat1 * 1.0 + maskMat4 * 0.5 + 1.0), maskMat1);
|
||||
CHECK_DIFF((maskMat1 * 1.0 + maskMat4 * 0.5 + 1.0)*1.25, maskMat5);
|
||||
CHECK_DIFF(1.25 * (maskMat1 * 1.0 + maskMat4 * 0.5 + 1.0), maskMat5);
|
||||
CHECK_DIFF(-(maskMat1 * 2.0 + maskMat4 * (-1) + 1.0), maskMat1);
|
||||
CHECK_DIFF((maskMat1 * 1.0 + maskMat4), maskMat5);
|
||||
CHECK_DIFF((maskMat4 + maskMat1 * 1.0), maskMat5);
|
||||
CHECK_DIFF((maskMat1 * 3.0 + 1.0) + maskMat1, maskMat5);
|
||||
CHECK_DIFF(maskMat1 + (maskMat1 * 3.0 + 1.0), maskMat5);
|
||||
CHECK_DIFF(maskMat1*4.0 + (maskMat1 | maskMat1), maskMat5);
|
||||
CHECK_DIFF((maskMat1 | maskMat1) + maskMat1*4.0, maskMat5);
|
||||
CHECK_DIFF((maskMat1*3.0 + 1.0) + (maskMat1 | maskMat1), maskMat5);
|
||||
CHECK_DIFF((maskMat1 | maskMat1) + (maskMat1*3.0 + 1.0), maskMat5);
|
||||
CHECK_DIFF(maskMat1*4.0 + maskMat4*2.0, maskMat1 * 12);
|
||||
CHECK_DIFF((maskMat1*3.0 + 1.0) + maskMat4*2.0, maskMat1 * 12);
|
||||
CHECK_DIFF(maskMat4*2.0 + (maskMat1*3.0 + 1.0), maskMat1 * 12);
|
||||
CHECK_DIFF((maskMat1*3.0 + 1.0) + (maskMat1*2.0 + 2.0), maskMat1 * 8);
|
||||
|
||||
|
||||
CHECK_DIFF(maskMat5*1.0 - maskMat4, maskMat1);
|
||||
CHECK_DIFF(maskMat5 - maskMat1 * 4.0, maskMat1);
|
||||
CHECK_DIFF((maskMat4 * 1.0 + 4.0)- maskMat4, maskMat4);
|
||||
CHECK_DIFF(maskMat5 - (maskMat1 * 2.0 + 2.0), maskMat1);
|
||||
CHECK_DIFF(maskMat5*1.0 - (maskMat4 | maskMat4), maskMat1);
|
||||
CHECK_DIFF((maskMat5 | maskMat5) - maskMat1 * 4.0, maskMat1);
|
||||
CHECK_DIFF((maskMat5 | maskMat5) - maskMat1 * 4.0, maskMat1);
|
||||
CHECK_DIFF((maskMat4 * 1.0 + 4.0)- (maskMat4 | maskMat4), maskMat4);
|
||||
CHECK_DIFF((maskMat5 | maskMat5) - (maskMat1 * 2.0 + 2.0), maskMat1);
|
||||
CHECK_DIFF(maskMat1*5.0 - maskMat4 * 1.0, maskMat1);
|
||||
@@ -287,7 +287,7 @@ bool CV_OperationsTest::TestMat()
|
||||
|
||||
CHECK_DIFF((maskMat5 - maskMat4)* 4.0, maskMat4);
|
||||
CHECK_DIFF(4.0 * (maskMat5 - maskMat4), maskMat4);
|
||||
|
||||
|
||||
CHECK_DIFF(-((maskMat4 | maskMat4) - (maskMat5 | maskMat5)), maskMat1);
|
||||
|
||||
CHECK_DIFF(4.0 * (maskMat1 | maskMat1), maskMat4);
|
||||
@@ -298,9 +298,9 @@ bool CV_OperationsTest::TestMat()
|
||||
#endif
|
||||
CHECK_DIFF((maskMat4 / 2.0) / 2.0 , maskMat1);
|
||||
CHECK_DIFF(-(maskMat4 - maskMat5) , maskMat1);
|
||||
CHECK_DIFF(-((maskMat4 - maskMat5) * 1.0), maskMat1);
|
||||
|
||||
|
||||
CHECK_DIFF(-((maskMat4 - maskMat5) * 1.0), maskMat1);
|
||||
|
||||
|
||||
/////////////////////////////
|
||||
CHECK_DIFF(maskMat4 / maskMat4, maskMat1);
|
||||
|
||||
@@ -312,7 +312,7 @@ bool CV_OperationsTest::TestMat()
|
||||
CHECK_DIFF(maskMat4.mul(maskMat4 / 4), maskMat4);
|
||||
CHECK_DIFF(maskMat4.mul(maskMat4) * 0.25, maskMat4);
|
||||
CHECK_DIFF(0.25 * maskMat4.mul(maskMat4), maskMat4);
|
||||
|
||||
|
||||
////// Element-wise division
|
||||
|
||||
CHECK_DIFF(maskMat4 / maskMat4, maskMat1);
|
||||
@@ -328,8 +328,8 @@ bool CV_OperationsTest::TestMat()
|
||||
CHECK_DIFF(maskMat4 / maskMat4.mul(maskMat1), maskMat1);
|
||||
CHECK_DIFF((maskMat4 & maskMat4) / maskMat4.mul(maskMat1), maskMat1);
|
||||
|
||||
CHECK_DIFF(4.0 / maskMat4, maskMat1);
|
||||
CHECK_DIFF(4.0 / (maskMat4 | maskMat4), maskMat1);
|
||||
CHECK_DIFF(4.0 / maskMat4, maskMat1);
|
||||
CHECK_DIFF(4.0 / (maskMat4 | maskMat4), maskMat1);
|
||||
CHECK_DIFF(4.0 / (maskMat1 * 4.0), maskMat1);
|
||||
CHECK_DIFF(4.0 / (maskMat4 / maskMat1), maskMat1);
|
||||
|
||||
@@ -337,9 +337,9 @@ bool CV_OperationsTest::TestMat()
|
||||
m = maskMat4.clone(); m/=maskMat4; CHECK_DIFF(m, maskMat1);
|
||||
m = maskMat4.clone(); m/=(maskMat1 * 4.0); CHECK_DIFF(m, maskMat1);
|
||||
m = maskMat4.clone(); m/=(maskMat4 / maskMat1); CHECK_DIFF(m, maskMat1);
|
||||
|
||||
/////////////////////////////
|
||||
float matrix_data[] = { 3, 1, -4, -5, 1, 0, 0, 1.1f, 1.5f};
|
||||
|
||||
/////////////////////////////
|
||||
float matrix_data[] = { 3, 1, -4, -5, 1, 0, 0, 1.1f, 1.5f};
|
||||
Mat mt(3, 3, CV_32F, matrix_data);
|
||||
Mat mi = mt.inv();
|
||||
Mat d1 = Mat::eye(3, 3, CV_32F);
|
||||
@@ -369,13 +369,13 @@ bool CV_OperationsTest::TestMat()
|
||||
m = mi.clone(); m*=mt_tr.t(); CHECK_DIFF_FLT(m, d1);
|
||||
|
||||
CHECK_DIFF_FLT( (mi * 2) * mt, d2);
|
||||
CHECK_DIFF_FLT( mi * (2 * mt), d2);
|
||||
CHECK_DIFF_FLT( mi * (2 * mt), d2);
|
||||
CHECK_DIFF_FLT( mt.t() * mi_tr, d1 );
|
||||
CHECK_DIFF_FLT( mt_tr * mi.t(), d1 );
|
||||
CHECK_DIFF_FLT( mt_tr * mi.t(), d1 );
|
||||
CHECK_DIFF_FLT( (mi * 0.4) * (mt * 5), d2);
|
||||
|
||||
CHECK_DIFF_FLT( mt.t() * (mi_tr * 2), d2 );
|
||||
CHECK_DIFF_FLT( (mt_tr * 2) * mi.t(), d2 );
|
||||
CHECK_DIFF_FLT( (mt_tr * 2) * mi.t(), d2 );
|
||||
|
||||
CHECK_DIFF_FLT(mt.t() * mi.t(), d1);
|
||||
CHECK_DIFF_FLT( (mi * mt) * 2.0, d2);
|
||||
@@ -386,9 +386,9 @@ bool CV_OperationsTest::TestMat()
|
||||
|
||||
Mat mt_mul_2_plus_1;
|
||||
gemm(mt, d1, 2, Mat::ones(3, 3, CV_32F), 1, mt_mul_2_plus_1);
|
||||
|
||||
|
||||
CHECK_DIFF( (mt * 2.0 + 1.0) * mi, mt_mul_2_plus_1 * mi); // (A*alpha + beta)*B
|
||||
CHECK_DIFF( mi * (mt * 2.0 + 1.0), mi * mt_mul_2_plus_1); // A*(B*alpha + beta)
|
||||
CHECK_DIFF( mi * (mt * 2.0 + 1.0), mi * mt_mul_2_plus_1); // A*(B*alpha + beta)
|
||||
CHECK_DIFF( (mt * 2.0 + 1.0) * (mi * 2), mt_mul_2_plus_1 * mi2); // (A*alpha + beta)*(B*gamma)
|
||||
CHECK_DIFF( (mi *2)* (mt * 2.0 + 1.0), mi2 * mt_mul_2_plus_1); // (A*gamma)*(B*alpha + beta)
|
||||
CHECK_DIFF_FLT( (mt * 2.0 + 1.0) * mi.t(), mt_mul_2_plus_1 * mi_tr); // (A*alpha + beta)*B^t
|
||||
@@ -405,7 +405,7 @@ bool CV_OperationsTest::TestMat()
|
||||
CHECK_DIFF_FLT( (mi * mt) + d2 * 0.5, d2);
|
||||
CHECK_DIFF_FLT( d2 * 0.5 + (mi * mt), d2);
|
||||
CHECK_DIFF_FLT( (mi * mt) - d1 * 2, -d1);
|
||||
CHECK_DIFF_FLT( d1 * 2 - (mi * mt), d1);
|
||||
CHECK_DIFF_FLT( d1 * 2 - (mi * mt), d1);
|
||||
|
||||
CHECK_DIFF_FLT( (mi * mt) + mi.t(), mi_tr + d1);
|
||||
CHECK_DIFF_FLT( mi.t() + (mi * mt), mi_tr + d1);
|
||||
@@ -417,7 +417,7 @@ bool CV_OperationsTest::TestMat()
|
||||
|
||||
CHECK_DIFF_FLT(mt.inv() * mt, d1);
|
||||
|
||||
CHECK_DIFF_FLT(mt.inv() * (2*mt - mt), d1);
|
||||
CHECK_DIFF_FLT(mt.inv() * (2*mt - mt), d1);
|
||||
#endif
|
||||
}
|
||||
catch (const test_excep& e)
|
||||
@@ -435,18 +435,18 @@ bool CV_OperationsTest::SomeMatFunctions()
|
||||
{
|
||||
Mat rgba( 10, 10, CV_8UC4, Scalar(1,2,3,4) );
|
||||
Mat bgr( rgba.rows, rgba.cols, CV_8UC3 );
|
||||
Mat alpha( rgba.rows, rgba.cols, CV_8UC1 );
|
||||
Mat alpha( rgba.rows, rgba.cols, CV_8UC1 );
|
||||
Mat out[] = { bgr, alpha };
|
||||
// rgba[0] -> bgr[2], rgba[1] -> bgr[1],
|
||||
// rgba[2] -> bgr[0], rgba[3] -> alpha[0]
|
||||
int from_to[] = { 0,2, 1,1, 2,0, 3,3 };
|
||||
mixChannels( &rgba, 1, out, 2, from_to, 4 );
|
||||
mixChannels( &rgba, 1, out, 2, from_to, 4 );
|
||||
|
||||
Mat bgr_exp( rgba.size(), CV_8UC3, Scalar(3,2,1));
|
||||
Mat alpha_exp( rgba.size(), CV_8UC1, Scalar(4));
|
||||
|
||||
CHECK_DIFF(bgr_exp, bgr);
|
||||
CHECK_DIFF(alpha_exp, alpha);
|
||||
CHECK_DIFF(bgr_exp, bgr);
|
||||
CHECK_DIFF(alpha_exp, alpha);
|
||||
}
|
||||
catch (const test_excep& e)
|
||||
{
|
||||
@@ -477,7 +477,7 @@ bool CV_OperationsTest::TestSubMatAccess()
|
||||
|
||||
// set up display coords, really just the S frame
|
||||
std::vector<float>coords;
|
||||
|
||||
|
||||
for (int i=0; i<16; i++)
|
||||
{
|
||||
coords.push_back(T_bs(i));
|
||||
@@ -495,7 +495,7 @@ bool CV_OperationsTest::TestSubMatAccess()
|
||||
}
|
||||
|
||||
bool CV_OperationsTest::TestTemplateMat()
|
||||
{
|
||||
{
|
||||
try
|
||||
{
|
||||
Mat_<float> one_3x1(3, 1, 1.0f);
|
||||
@@ -505,7 +505,7 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
|
||||
float data[] = { sqrt(2.f)/2, -sqrt(2.f)/2, 1.f, sqrt(2.f)/2, sqrt(2.f)/2, 10.f };
|
||||
Mat_<float> rot_2x3(2, 3, data);
|
||||
|
||||
|
||||
Mat_<float> res = Mat(Mat(2 * rot_2x3) * Mat(one_3x1 + shi_3x1 + shi_3x1 + shi_3x1) - shi_2x1) + shift;
|
||||
Mat_<float> resS = rot_2x3 * one_3x1;
|
||||
|
||||
@@ -515,25 +515,25 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
add(tmp, shi_3x1, tmp);
|
||||
gemm(rot_2x3, tmp, 2, shi_2x1, -1, res2, 0);
|
||||
add(res2, Mat(2, 1, CV_32F, shift), res2);
|
||||
|
||||
|
||||
gemm(rot_2x3, one_3x1, 1, shi_2x1, 0, resS2, 0);
|
||||
CHECK_DIFF(res, res2);
|
||||
CHECK_DIFF(res, res2);
|
||||
CHECK_DIFF(resS, resS2);
|
||||
|
||||
|
||||
|
||||
Mat_<float> mat4x4(4, 4);
|
||||
randu(mat4x4, Scalar(0), Scalar(10));
|
||||
|
||||
Mat_<float> roi1 = mat4x4(Rect(Point(1, 1), Size(2, 2)));
|
||||
Mat_<float> roi2 = mat4x4(Range(1, 3), Range(1, 3));
|
||||
|
||||
|
||||
CHECK_DIFF(roi1, roi2);
|
||||
CHECK_DIFF(mat4x4, mat4x4(Rect(Point(0,0), mat4x4.size())));
|
||||
CHECK_DIFF(mat4x4, mat4x4(Rect(Point(0,0), mat4x4.size())));
|
||||
|
||||
Mat_<int> intMat10(3, 3, 10);
|
||||
Mat_<int> intMat11(3, 3, 11);
|
||||
Mat_<uchar> resMat(3, 3, 255);
|
||||
|
||||
|
||||
CHECK_DIFF(resMat, intMat10 == intMat10);
|
||||
CHECK_DIFF(resMat, intMat10 < intMat11);
|
||||
CHECK_DIFF(resMat, intMat11 > intMat10);
|
||||
@@ -551,17 +551,17 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
Mat_<uchar> maskMat5(3, 3, 5);
|
||||
Mat_<uchar> maskMat0(3, 3, (uchar)0);
|
||||
|
||||
CHECK_DIFF(maskMat0, maskMat4 & maskMat1);
|
||||
CHECK_DIFF(maskMat0, maskMat4 & maskMat1);
|
||||
CHECK_DIFF(maskMat0, Scalar(1) & maskMat4);
|
||||
CHECK_DIFF(maskMat0, maskMat4 & Scalar(1));
|
||||
|
||||
|
||||
Mat_<uchar> m;
|
||||
m = maskMat4.clone(); m&=maskMat1; CHECK_DIFF(maskMat0, m);
|
||||
m = maskMat4.clone(); m&=Scalar(1); CHECK_DIFF(maskMat0, m);
|
||||
|
||||
m = maskMat4.clone(); m|=maskMat1; CHECK_DIFF(maskMat5, m);
|
||||
m = maskMat4.clone(); m^=maskMat1; CHECK_DIFF(maskMat5, m);
|
||||
|
||||
|
||||
CHECK_DIFF(maskMat0, (maskMat4 | maskMat4) & (maskMat1 | maskMat1));
|
||||
CHECK_DIFF(maskMat0, (maskMat4 | maskMat4) & maskMat1);
|
||||
CHECK_DIFF(maskMat0, maskMat4 & (maskMat1 | maskMat1));
|
||||
@@ -573,7 +573,7 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
CHECK_DIFF(maskMat5, maskMat5 | (maskMat4 ^ Scalar(1)));
|
||||
|
||||
CHECK_DIFF(~maskMat1, maskMat1 ^ 0xFF);
|
||||
CHECK_DIFF(~(maskMat1 | maskMat1), maskMat1 ^ 0xFF);
|
||||
CHECK_DIFF(~(maskMat1 | maskMat1), maskMat1 ^ 0xFF);
|
||||
|
||||
CHECK_DIFF(maskMat1 + maskMat4, maskMat5);
|
||||
CHECK_DIFF(maskMat1 + Scalar(4), maskMat5);
|
||||
@@ -597,7 +597,7 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
|
||||
CHECK_DIFF(maskMat1, min(maskMat1, maskMat5));
|
||||
CHECK_DIFF(maskMat5, max(maskMat1, maskMat5));
|
||||
|
||||
|
||||
m = maskMat5.clone(); m-=Scalar(1); CHECK_DIFF(m, maskMat4);
|
||||
m = maskMat5.clone(); m-=maskMat1; CHECK_DIFF(m, maskMat4);
|
||||
m = maskMat5.clone(); m-=(maskMat1 | maskMat1); CHECK_DIFF(m, maskMat4);
|
||||
@@ -605,31 +605,31 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
m = maskMat4.clone(); m |= Scalar(1); CHECK_DIFF(maskMat5, m);
|
||||
m = maskMat5.clone(); m ^= Scalar(1); CHECK_DIFF(maskMat4, m);
|
||||
|
||||
CHECK_DIFF(maskMat1, maskMat4/4.0);
|
||||
CHECK_DIFF(maskMat1, maskMat4/4.0);
|
||||
|
||||
Mat_<float> negf(3, 3, -3.0);
|
||||
Mat_<float> negf(3, 3, -3.0);
|
||||
Mat_<float> posf = -negf;
|
||||
Mat_<float> posf2 = posf * 2;
|
||||
Mat_<int> negi(3, 3, -3);
|
||||
Mat_<int> negi(3, 3, -3);
|
||||
|
||||
CHECK_DIFF(abs(negf), -negf);
|
||||
CHECK_DIFF(abs(posf - posf2), -negf);
|
||||
CHECK_DIFF(abs(negf), -negf);
|
||||
CHECK_DIFF(abs(posf - posf2), -negf);
|
||||
CHECK_DIFF(abs(negi), -(negi & negi));
|
||||
|
||||
CHECK_DIFF(5.0 - maskMat4, maskMat1);
|
||||
|
||||
|
||||
|
||||
CHECK_DIFF(maskMat4.mul(maskMat4, 0.25), maskMat4);
|
||||
CHECK_DIFF(maskMat4.mul(maskMat1 * 4, 0.25), maskMat4);
|
||||
CHECK_DIFF(maskMat4.mul(maskMat4 / 4), maskMat4);
|
||||
|
||||
|
||||
|
||||
////// Element-wise division
|
||||
|
||||
CHECK_DIFF(maskMat4 / maskMat4, maskMat1);
|
||||
CHECK_DIFF(4.0 / maskMat4, maskMat1);
|
||||
m = maskMat4.clone(); m/=4.0; CHECK_DIFF(m, maskMat1);
|
||||
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
typedef Mat_<int> TestMat_t;
|
||||
@@ -638,7 +638,7 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
|
||||
TestMat_t::iterator beg = negi.begin();
|
||||
TestMat_t::iterator end = negi.end();
|
||||
|
||||
|
||||
TestMat_t::const_iterator cbeg = cnegi.begin();
|
||||
TestMat_t::const_iterator cend = cnegi.end();
|
||||
|
||||
@@ -654,14 +654,14 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
CHECK_DIFF(negi.col(1), negi.col(2));
|
||||
CHECK_DIFF(negi.row(1), negi.row(2));
|
||||
CHECK_DIFF(negi.col(1), negi.diag());
|
||||
|
||||
|
||||
if (Mat_<Point2f>(1, 1).elemSize1() != sizeof(float)) throw test_excep();
|
||||
if (Mat_<Point2f>(1, 1).elemSize() != 2 * sizeof(float)) throw test_excep();
|
||||
if (Mat_<Point2f>(1, 1).depth() != CV_32F) throw test_excep();
|
||||
if (Mat_<float>(1, 1).depth() != CV_32F) throw test_excep();
|
||||
if (Mat_<int>(1, 1).depth() != CV_32S) throw test_excep();
|
||||
if (Mat_<double>(1, 1).depth() != CV_64F) throw test_excep();
|
||||
if (Mat_<Point3d>(1, 1).depth() != CV_64F) throw test_excep();
|
||||
if (Mat_<Point3d>(1, 1).depth() != CV_64F) throw test_excep();
|
||||
if (Mat_<signed char>(1, 1).depth() != CV_8S) throw test_excep();
|
||||
if (Mat_<unsigned short>(1, 1).depth() != CV_16U) throw test_excep();
|
||||
if (Mat_<unsigned short>(1, 1).channels() != 1) throw test_excep();
|
||||
@@ -671,10 +671,10 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
|
||||
Mat_<uchar> eye = Mat_<uchar>::zeros(2, 2); CHECK_DIFF(Mat_<uchar>::zeros(Size(2, 2)), eye);
|
||||
eye.at<uchar>(Point(0,0)) = 1; eye.at<uchar>(1, 1) = 1;
|
||||
|
||||
|
||||
CHECK_DIFF(Mat_<uchar>::eye(2, 2), eye);
|
||||
CHECK_DIFF(eye, Mat_<uchar>::eye(Size(2,2)));
|
||||
|
||||
CHECK_DIFF(eye, Mat_<uchar>::eye(Size(2,2)));
|
||||
|
||||
Mat_<uchar> ones(2, 2, (uchar)1);
|
||||
CHECK_DIFF(ones, Mat_<uchar>::ones(Size(2,2)));
|
||||
CHECK_DIFF(Mat_<uchar>::ones(2, 2), ones);
|
||||
@@ -692,22 +692,22 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
|
||||
if (matFromData(0,0) != uchar_data[0])throw test_excep();
|
||||
if (mat2(0,0) != uchar_data[0]) throw test_excep();
|
||||
|
||||
|
||||
Mat_<uchar> rect(eye, Rect(0, 0, 1, 1));
|
||||
if (rect.cols != 1 || rect.rows != 1 || rect(0,0) != uchar_data[0]) throw test_excep();
|
||||
|
||||
//cv::Mat_<_Tp>::adjustROI(int,int,int,int)
|
||||
//cv::Mat_<_Tp>::cross(const Mat_&) const
|
||||
//cv::Mat_<_Tp>::cross(const Mat_&) const
|
||||
//cv::Mat_<_Tp>::Mat_(const vector<_Tp>&,bool)
|
||||
//cv::Mat_<_Tp>::Mat_(int,int,_Tp*,size_t)
|
||||
//cv::Mat_<_Tp>::Mat_(int,int,const _Tp&)
|
||||
//cv::Mat_<_Tp>::Mat_(Size,const _Tp&)
|
||||
//cv::Mat_<_Tp>::mul(const Mat_<_Tp>&,double) const
|
||||
//cv::Mat_<_Tp>::mul(const MatExpr_<MatExpr_Op2_<Mat_<_Tp>,double,Mat_<_Tp>,MatOp_DivRS_<Mat> >,Mat_<_Tp> >&,double) const
|
||||
//cv::Mat_<_Tp>::mul(const MatExpr_<MatExpr_Op2_<Mat_<_Tp>,double,Mat_<_Tp>,MatOp_Scale_<Mat> >,Mat_<_Tp> >&,double) const
|
||||
//cv::Mat_<_Tp>::operator Mat_<T2>() const
|
||||
//cv::Mat_<_Tp>::operator MatExpr_<Mat_<_Tp>,Mat_<_Tp> >() const
|
||||
//cv::Mat_<_Tp>::operator()(const Range&,const Range&) const
|
||||
//cv::Mat_<_Tp>::Mat_(int,int,const _Tp&)
|
||||
//cv::Mat_<_Tp>::Mat_(Size,const _Tp&)
|
||||
//cv::Mat_<_Tp>::mul(const Mat_<_Tp>&,double) const
|
||||
//cv::Mat_<_Tp>::mul(const MatExpr_<MatExpr_Op2_<Mat_<_Tp>,double,Mat_<_Tp>,MatOp_DivRS_<Mat> >,Mat_<_Tp> >&,double) const
|
||||
//cv::Mat_<_Tp>::mul(const MatExpr_<MatExpr_Op2_<Mat_<_Tp>,double,Mat_<_Tp>,MatOp_Scale_<Mat> >,Mat_<_Tp> >&,double) const
|
||||
//cv::Mat_<_Tp>::operator Mat_<T2>() const
|
||||
//cv::Mat_<_Tp>::operator MatExpr_<Mat_<_Tp>,Mat_<_Tp> >() const
|
||||
//cv::Mat_<_Tp>::operator()(const Range&,const Range&) const
|
||||
//cv::Mat_<_Tp>::operator()(const Rect&) const
|
||||
|
||||
//cv::Mat_<_Tp>::operator=(const MatExpr_Base&)
|
||||
@@ -716,7 +716,7 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
|
||||
///////////////////////////////
|
||||
|
||||
float matrix_data[] = { 3, 1, -4, -5, 1, 0, 0, 1.1f, 1.5f};
|
||||
float matrix_data[] = { 3, 1, -4, -5, 1, 0, 0, 1.1f, 1.5f};
|
||||
Mat_<float> mt(3, 3, matrix_data);
|
||||
Mat_<float> mi = mt.inv();
|
||||
Mat_<float> d1 = Mat_<float>::eye(3, 3);
|
||||
@@ -764,7 +764,7 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
if (Mat3i(1, 1).channels() != 3) throw test_excep();
|
||||
if (Mat3w(1, 1).channels() != 3) throw test_excep();
|
||||
if (Mat3s(1, 1).channels() != 3) throw test_excep();
|
||||
|
||||
|
||||
vector<Mat_<float> > mvf, mvf2;
|
||||
Mat_<Vec2f> mf2;
|
||||
mvf.push_back(Mat_<float>::ones(4, 3));
|
||||
@@ -773,14 +773,14 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
split(mf2, mvf2);
|
||||
CV_Assert( norm(mvf2[0], mvf[0], CV_C) == 0 &&
|
||||
norm(mvf2[1], mvf[1], CV_C) == 0 );
|
||||
|
||||
|
||||
{
|
||||
Mat a(2,2,CV_32F,1.f);
|
||||
Mat b(1,2,CV_32F,1.f);
|
||||
Mat c = (a*b.t()).t();
|
||||
CV_Assert( norm(c, CV_L1) == 4. );
|
||||
}
|
||||
|
||||
|
||||
bool badarg_catched = false;
|
||||
try
|
||||
{
|
||||
@@ -793,10 +793,10 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
badarg_catched = true;
|
||||
}
|
||||
CV_Assert( badarg_catched );
|
||||
|
||||
|
||||
#include <iostream>
|
||||
#include <opencv2/core/core.hpp>
|
||||
|
||||
|
||||
Size size(2, 5);
|
||||
TestType<float>(size);
|
||||
TestType<cv::Vec3f>(size);
|
||||
@@ -814,7 +814,7 @@ bool CV_OperationsTest::TestTemplateMat()
|
||||
}
|
||||
|
||||
bool CV_OperationsTest::TestMatND()
|
||||
{
|
||||
{
|
||||
int sizes[] = { 3, 3, 3};
|
||||
cv::MatND nd(3, sizes, CV_32F);
|
||||
|
||||
@@ -822,7 +822,7 @@ bool CV_OperationsTest::TestMatND()
|
||||
}
|
||||
|
||||
bool CV_OperationsTest::TestSparseMat()
|
||||
{
|
||||
{
|
||||
try
|
||||
{
|
||||
int sizes[] = { 10, 10, 10};
|
||||
@@ -844,62 +844,62 @@ bool CV_OperationsTest::TestSparseMat()
|
||||
}
|
||||
|
||||
|
||||
bool CV_OperationsTest::TestMatxMultiplication()
|
||||
{
|
||||
try
|
||||
{
|
||||
Matx33f mat(1, 1, 1, 0, 1, 1, 0, 0, 1); // Identity matrix
|
||||
Point2f pt(3, 4);
|
||||
Point3f res = mat * pt; // Correctly assumes homogeneous coordinates
|
||||
|
||||
bool CV_OperationsTest::TestMatxMultiplication()
|
||||
{
|
||||
try
|
||||
{
|
||||
Matx33f mat(1, 1, 1, 0, 1, 1, 0, 0, 1); // Identity matrix
|
||||
Point2f pt(3, 4);
|
||||
Point3f res = mat * pt; // Correctly assumes homogeneous coordinates
|
||||
|
||||
Vec3f res2 = mat*Vec3f(res.x, res.y, res.z);
|
||||
|
||||
if(res.x != 8.0) throw test_excep();
|
||||
if(res.y != 5.0) throw test_excep();
|
||||
|
||||
if(res.x != 8.0) throw test_excep();
|
||||
if(res.y != 5.0) throw test_excep();
|
||||
if(res.z != 1.0) throw test_excep();
|
||||
|
||||
if(res2[0] != 14.0) throw test_excep();
|
||||
if(res2[1] != 6.0) throw test_excep();
|
||||
|
||||
if(res2[0] != 14.0) throw test_excep();
|
||||
if(res2[1] != 6.0) throw test_excep();
|
||||
if(res2[2] != 1.0) throw test_excep();
|
||||
|
||||
|
||||
Matx44f mat44f(1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1);
|
||||
Matx44d mat44d(1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1);
|
||||
Scalar s(4, 3, 2, 1);
|
||||
Scalar sf = mat44f*s;
|
||||
Scalar sd = mat44d*s;
|
||||
|
||||
if(sf[0] != 10.0) throw test_excep();
|
||||
if(sf[1] != 6.0) throw test_excep();
|
||||
|
||||
if(sf[0] != 10.0) throw test_excep();
|
||||
if(sf[1] != 6.0) throw test_excep();
|
||||
if(sf[2] != 3.0) throw test_excep();
|
||||
if(sf[3] != 1.0) throw test_excep();
|
||||
|
||||
if(sd[0] != 10.0) throw test_excep();
|
||||
if(sd[1] != 6.0) throw test_excep();
|
||||
|
||||
if(sd[0] != 10.0) throw test_excep();
|
||||
if(sd[1] != 6.0) throw test_excep();
|
||||
if(sd[2] != 3.0) throw test_excep();
|
||||
if(sd[3] != 1.0) throw test_excep();
|
||||
}
|
||||
catch(const test_excep&)
|
||||
{
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch(const test_excep&)
|
||||
{
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CV_OperationsTest::TestVec()
|
||||
{
|
||||
try
|
||||
{
|
||||
bool CV_OperationsTest::TestVec()
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::Mat hsvImage_f(5, 5, CV_32FC3), hsvImage_b(5, 5, CV_8UC3);
|
||||
int i = 0,j = 0;
|
||||
cv::Vec3f a;
|
||||
|
||||
|
||||
//these compile
|
||||
cv::Vec3b b = a;
|
||||
hsvImage_f.at<cv::Vec3f>(i,j) = cv::Vec3f((float)i,0,1);
|
||||
hsvImage_b.at<cv::Vec3b>(i,j) = cv::Vec3b(cv::Vec3f((float)i,0,1));
|
||||
|
||||
|
||||
//these don't
|
||||
b = cv::Vec3f(1,0,0);
|
||||
cv::Vec3b c;
|
||||
@@ -907,37 +907,37 @@ bool CV_OperationsTest::TestVec()
|
||||
hsvImage_b.at<cv::Vec3b>(i,j) = cv::Vec3f((float)i,0,1);
|
||||
hsvImage_b.at<cv::Vec3b>(i,j) = a;
|
||||
hsvImage_b.at<cv::Vec3b>(i,j) = cv::Vec3f(1,2,3);
|
||||
}
|
||||
catch(const test_excep&)
|
||||
{
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch(const test_excep&)
|
||||
{
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CV_OperationsTest::operations1()
|
||||
{
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
Point3d p1(1, 1, 1), p2(2, 2, 2), p4(4, 4, 4);
|
||||
p1*=2;
|
||||
Point3d p1(1, 1, 1), p2(2, 2, 2), p4(4, 4, 4);
|
||||
p1*=2;
|
||||
if (!(p1 == p2)) throw test_excep();
|
||||
if (!(p2 * 2 == p4)) throw test_excep();
|
||||
if (!(p2 * 2.f == p4)) throw test_excep();
|
||||
if (!(p2 * 2.f == p4)) throw test_excep();
|
||||
|
||||
Point2d pi1(1, 1), pi2(2, 2), pi4(4, 4);
|
||||
Point2d pi1(1, 1), pi2(2, 2), pi4(4, 4);
|
||||
pi1*=2;
|
||||
if (!(pi1 == pi2)) throw test_excep();
|
||||
if (!(pi2 * 2 == pi4)) throw test_excep();
|
||||
if (!(pi2 * 2.f == pi4)) throw test_excep();
|
||||
if (!(pi2 * 2.f == pi4)) throw test_excep();
|
||||
|
||||
|
||||
Vec2d v12(1, 1), v22(2, 2);
|
||||
v12*=2.0;
|
||||
if (!(v12 == v22)) throw test_excep();
|
||||
|
||||
|
||||
Vec3d v13(1, 1, 1), v23(2, 2, 2);
|
||||
v13*=2.0;
|
||||
if (!(v13 == v23)) throw test_excep();
|
||||
@@ -945,12 +945,12 @@ bool CV_OperationsTest::operations1()
|
||||
Vec4d v14(1, 1, 1, 1), v24(2, 2, 2, 2);
|
||||
v14*=2.0;
|
||||
if (!(v14 == v24)) throw test_excep();
|
||||
|
||||
|
||||
Size sz(10, 20);
|
||||
if (sz.area() != 200) throw test_excep();
|
||||
if (sz.width != 10 || sz.height != 20) throw test_excep();
|
||||
if (((CvSize)sz).width != 10 || ((CvSize)sz).height != 20) throw test_excep();
|
||||
|
||||
|
||||
Vec<double, 5> v5d(1, 1, 1, 1, 1);
|
||||
Vec<double, 6> v6d(1, 1, 1, 1, 1, 1);
|
||||
Vec<double, 7> v7d(1, 1, 1, 1, 1, 1, 1);
|
||||
@@ -963,26 +963,26 @@ bool CV_OperationsTest::operations1()
|
||||
if (!v10dzero[ii] == 0.0)
|
||||
throw test_excep();
|
||||
}
|
||||
|
||||
|
||||
Mat A(1, 32, CV_32F), B;
|
||||
for( int i = 0; i < A.cols; i++ )
|
||||
A.at<float>(i) = (float)(i <= 12 ? i : 24 - i);
|
||||
transpose(A, B);
|
||||
|
||||
|
||||
int minidx[2] = {0, 0}, maxidx[2] = {0, 0};
|
||||
double minval = 0, maxval = 0;
|
||||
minMaxIdx(A, &minval, &maxval, minidx, maxidx);
|
||||
|
||||
|
||||
if( !(minidx[0] == 0 && minidx[1] == 31 && maxidx[0] == 0 && maxidx[1] == 12 &&
|
||||
minval == -7 && maxval == 12))
|
||||
throw test_excep();
|
||||
|
||||
|
||||
minMaxIdx(B, &minval, &maxval, minidx, maxidx);
|
||||
|
||||
|
||||
if( !(minidx[0] == 31 && minidx[1] == 0 && maxidx[0] == 12 && maxidx[1] == 0 &&
|
||||
minval == -7 && maxval == 12))
|
||||
throw test_excep();
|
||||
|
||||
|
||||
Matx33f b(1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f);
|
||||
Mat c;
|
||||
add(Mat::zeros(3, 3, CV_32F), b, c);
|
||||
@@ -1004,8 +1004,8 @@ bool CV_OperationsTest::operations1()
|
||||
|
||||
|
||||
bool CV_OperationsTest::TestSVD()
|
||||
{
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
Mat A = (Mat_<double>(3,4) << 1, 2, -1, 4, 2, 4, 3, 5, -1, -2, 6, 7);
|
||||
Mat x;
|
||||
@@ -1013,23 +1013,23 @@ bool CV_OperationsTest::TestSVD()
|
||||
if( norm(A*x, CV_C) > FLT_EPSILON )
|
||||
throw test_excep();
|
||||
|
||||
SVD svd(A, SVD::FULL_UV);
|
||||
SVD svd(A, SVD::FULL_UV);
|
||||
if( norm(A*svd.vt.row(3).t(), CV_C) > FLT_EPSILON )
|
||||
throw test_excep();
|
||||
|
||||
|
||||
Mat Dp(3,3,CV_32FC1);
|
||||
Mat Dc(3,3,CV_32FC1);
|
||||
Mat Q(3,3,CV_32FC1);
|
||||
Mat U,Vt,R,T,W;
|
||||
|
||||
|
||||
Dp.at<float>(0,0)=0.86483884f; Dp.at<float>(0,1)= -0.3077251f; Dp.at<float>(0,2)=-0.55711365f;
|
||||
Dp.at<float>(1,0)=0.49294353f; Dp.at<float>(1,1)=-0.24209651f; Dp.at<float>(1,2)=-0.25084701f;
|
||||
Dp.at<float>(2,0)=0; Dp.at<float>(2,1)=0; Dp.at<float>(2,2)=0;
|
||||
|
||||
|
||||
Dc.at<float>(0,0)=0.75632739f; Dc.at<float>(0,1)= -0.38859656f; Dc.at<float>(0,2)=-0.36773083f;
|
||||
Dc.at<float>(1,0)=0.9699229f; Dc.at<float>(1,1)=-0.49858192f; Dc.at<float>(1,2)=-0.47134098f;
|
||||
Dc.at<float>(2,0)=0.10566688f; Dc.at<float>(2,1)=-0.060333252f; Dc.at<float>(2,2)=-0.045333147f;
|
||||
|
||||
|
||||
Q=Dp*Dc.t();
|
||||
SVD decomp;
|
||||
decomp=SVD(Q);
|
||||
@@ -1037,7 +1037,7 @@ bool CV_OperationsTest::TestSVD()
|
||||
Vt=decomp.vt;
|
||||
W=decomp.w;
|
||||
Mat I = Mat::eye(3, 3, CV_32F);
|
||||
|
||||
|
||||
if( norm(U*U.t(), I, CV_C) > FLT_EPSILON ||
|
||||
norm(Vt*Vt.t(), I, CV_C) > FLT_EPSILON ||
|
||||
W.at<float>(2) < 0 || W.at<float>(1) < W.at<float>(2) ||
|
||||
@@ -1069,16 +1069,16 @@ void CV_OperationsTest::run( int /* start_from */)
|
||||
|
||||
if (!TestSparseMat())
|
||||
return;
|
||||
|
||||
|
||||
if (!TestVec())
|
||||
return;
|
||||
|
||||
|
||||
if (!TestMatxMultiplication())
|
||||
return;
|
||||
|
||||
|
||||
if (!TestSubMatAccess())
|
||||
return;
|
||||
|
||||
|
||||
if (!TestSVD())
|
||||
return;
|
||||
|
||||
@@ -1094,7 +1094,7 @@ class CV_SparseMatTest : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
CV_SparseMatTest() {}
|
||||
~CV_SparseMatTest() {}
|
||||
~CV_SparseMatTest() {}
|
||||
protected:
|
||||
void run(int)
|
||||
{
|
||||
@@ -1115,16 +1115,16 @@ protected:
|
||||
}
|
||||
int j, nz = rng.uniform(0, (p+2)/2), nz0 = 0;
|
||||
SparseMat_<int> v(dims,sizes);
|
||||
|
||||
|
||||
CV_Assert( (int)v.nzcount() == 0 );
|
||||
|
||||
|
||||
SparseMatIterator_<int> it = v.begin();
|
||||
SparseMatIterator_<int> it_end = v.end();
|
||||
|
||||
|
||||
for( k = 0; it != it_end; ++it, ++k )
|
||||
;
|
||||
CV_Assert( k == 0 );
|
||||
|
||||
|
||||
int sum0 = 0, sum = 0;
|
||||
for( j = 0; j < nz; j++ )
|
||||
{
|
||||
@@ -1149,22 +1149,22 @@ protected:
|
||||
nz0++;
|
||||
sum0 += val;
|
||||
}
|
||||
|
||||
|
||||
CV_Assert( (int)v.nzcount() == nz0 );
|
||||
|
||||
|
||||
it = v.begin();
|
||||
it_end = v.end();
|
||||
|
||||
|
||||
for( k = 0; it != it_end; ++it, ++k )
|
||||
sum += *it;
|
||||
CV_Assert( k == nz0 && sum == sum0 );
|
||||
|
||||
|
||||
v.clear();
|
||||
CV_Assert( (int)v.nzcount() == 0 );
|
||||
|
||||
|
||||
it = v.begin();
|
||||
it_end = v.end();
|
||||
|
||||
|
||||
for( k = 0; it != it_end; ++it, ++k )
|
||||
;
|
||||
CV_Assert( k == 0 );
|
||||
|
Reference in New Issue
Block a user