class cv::_InputArray

Overview

This is the proxy class for passing read-only input arrays into OpenCV functions. Moreā€¦

#include <mat.hpp>

class _InputArray
{
public:
    // enums

    enum
    {
        KIND_SHIFT              = 16,
        FIXED_TYPE              = 0x8000 <<KIND_SHIFT,
        FIXED_SIZE              = 0x4000 <<KIND_SHIFT,
        KIND_MASK               = 31 <<KIND_SHIFT,
        NONE                    = 0 <<KIND_SHIFT,
        MAT                     = 1 <<KIND_SHIFT,
        MATX                    = 2 <<KIND_SHIFT,
        STD_VECTOR              = 3 <<KIND_SHIFT,
        STD_VECTOR_VECTOR       = 4 <<KIND_SHIFT,
        STD_VECTOR_MAT          = 5 <<KIND_SHIFT,
        EXPR                    = 6 <<KIND_SHIFT,
        OPENGL_BUFFER           = 7 <<KIND_SHIFT,
        CUDA_HOST_MEM           = 8 <<KIND_SHIFT,
        CUDA_GPU_MAT            = 9 <<KIND_SHIFT,
        UMAT                    =10 <<KIND_SHIFT,
        STD_VECTOR_UMAT         =11 <<KIND_SHIFT,
        STD_BOOL_VECTOR         =12 <<KIND_SHIFT,
        STD_VECTOR_CUDA_GPU_MAT = 13 <<KIND_SHIFT,
        STD_ARRAY               =14 <<KIND_SHIFT,
        STD_ARRAY_MAT           =15 <<KIND_SHIFT,
    };

    // construction

    _InputArray();

    _InputArray(
        int _flags,
        void* _obj
        );

    _InputArray(const Mat& m);
    _InputArray(const MatExpr& expr);
    _InputArray(const std::vector<Mat>& vec);

    template <typename _Tp>
    _InputArray(const Mat_<_Tp>& m);

    template <typename _Tp>
    _InputArray(const std::vector<_Tp>& vec);

    _InputArray(const std::vector<bool>& vec);

    template <typename _Tp>
    _InputArray(const std::vector<std::vector<_Tp>>& vec);

    _InputArray(const std::vector<std::vector<bool>>&);

    template <typename _Tp>
    _InputArray(const std::vector<Mat_<_Tp>>& vec);

    template <typename _Tp>
    _InputArray(
        const _Tp* vec,
        int n
        );

    template <
        typename _Tp,
        int m,
        int n
        >
    _InputArray(const Matx<_Tp, m, n>& matx);

    _InputArray(const double& val);
    _InputArray(const cuda::GpuMat& d_mat);
    _InputArray(const std::vector<cuda::GpuMat>& d_mat_array);
    _InputArray(const ogl::Buffer& buf);
    _InputArray(const cuda::HostMem& cuda_mem);

    template <typename _Tp>
    _InputArray(const cudev::GpuMat_<_Tp>& m);

    _InputArray(const UMat& um);
    _InputArray(const std::vector<UMat>& umv);

    // methods

    int
    channels(int i = -1) const;

    int
    cols(int i = -1) const;

    void
    copyTo(const _OutputArray& arr) const;

    void
    copyTo(
        const _OutputArray& arr,
        const _InputArray& mask
        ) const;

    int
    depth(int i = -1) const;

    int
    dims(int i = -1) const;

    bool
    empty() const;

    int
    getFlags() const;

    cuda::GpuMat
    getGpuMat() const;

    void
    getGpuMatVector(std::vector<cuda::GpuMat>& gpumv) const;

    Mat
    getMat(int idx = -1) const;

    Mat
    getMat_(int idx = -1) const;

    void
    getMatVector(std::vector<Mat>& mv) const;

    void*
    getObj() const;

    ogl::Buffer
    getOGlBuffer() const;

    Size
    getSz() const;

    UMat
    getUMat(int idx = -1) const;

    void
    getUMatVector(std::vector<UMat>& umv) const;

    bool
    isContinuous(int i = -1) const;

    bool
    isGpuMatVector() const;

    bool
    isMat() const;

    bool
    isMatVector() const;

    bool
    isMatx() const;

    bool
    isSubmatrix(int i = -1) const;

    bool
    isUMat() const;

    bool
    isUMatVector() const;

    bool
    isVector() const;

    int
    kind() const;

    size_t
    offset(int i = -1) const;

    int
    rows(int i = -1) const;

    bool
    sameSize(const _InputArray& arr) const;

    Size
    size(int i = -1) const;

    int
    sizend(
        int* sz,
        int i = -1
        ) const;

    size_t
    step(int i = -1) const;

    size_t
    total(int i = -1) const;

    int
    type(int i = -1) const;

protected:
    // fields

    int flags;
    void* obj;
    Size sz;

    // methods

    void
    init(
        int _flags,
        const void* _obj
        );

    void
    init(
        int _flags,
        const void* _obj,
        Size _sz
        );
};

// direct descendants

class _OutputArray;

Detailed Documentation

This is the proxy class for passing read-only input arrays into OpenCV functions.

It is defined as:

typedef const _InputArray& InputArray;

where _InputArray is a class that can be constructed from Mat, Mat_<T>, Matx<T, m, n>, std::vector<T>, std::vector<std::vector<T> >, std::vector<Mat>, std::vector<Mat_<T> >, UMat, std::vector<UMat> or double. It can also be constructed from a matrix expression.

Since this is mostly implementation-level class, and its interface may change in future versions, we do not describe it in details. There are a few key things, though, that should be kept in mind:

  • When you see in the reference manual or in OpenCV source code a function that takes InputArray, it means that you can actually pass Mat, Matx, vector<T> etc. (see above the complete list).
  • Optional input arguments: If some of the input arrays may be empty, pass cv::noArray() (or simply cv::Mat() as you probably did before).
  • The class is designed solely for passing parameters. That is, normally you should not declare class members, local and global variables of this type.
  • If you want to design your own function or a class method that can operate of arrays of multiple types, you can use InputArray (or OutputArray) for the respective parameters. Inside a function you should use _InputArray::getMat() method to construct a matrix header for the array (without copying data). _InputArray::kind() can be used to distinguish Mat from vector<> etc., but normally it is not needed.

Here is how you can use a function that takes InputArray :

std::vector<Point2f> vec;
// points or a circle
for( int i = 0; i < 30; i++ )
    vec.push_back(Point2f((float)(100 + 30*cos(i*CV_PI*2/5)),
                          (float)(100 - 30*sin(i*CV_PI*2/5))));
cv::transform(vec, vec, cv::Matx23f(0.707, -0.707, 10, 0.707, 0.707, 20));

That is, we form an STL vector containing points, and apply in-place affine transformation to the vector using the 2x3 matrix created inline as Matx<float, 2, 3> instance.

Here is how such a function can be implemented (for simplicity, we implement a very specific case of it, according to the assertion statement inside) :

void myAffineTransform(InputArray _src, OutputArray _dst, InputArray _m)
{
    // get Mat headers for input arrays. This is O(1) operation,
    // unless _src and/or _m are matrix expressions.
    Mat src = _src.getMat(), m = _m.getMat();
    CV_Assert( src.type() == CV_32FC2 && m.type() == CV_32F && m.size() == Size(3, 2) );

    // [re]create the output array so that it has the proper size and type.
    // In case of Mat it calls Mat::create, in case of STL vector it calls vector::resize.
    _dst.create(src.size(), src.type());
    Mat dst = _dst.getMat();

    for( int i = 0; i < src.rows; i++ )
        for( int j = 0; j < src.cols; j++ )
        {
            Point2f pt = src.at<Point2f>(i, j);
            dst.at<Point2f>(i, j) = Point2f(m.at<float>(0, 0)*pt.x +
                                            m.at<float>(0, 1)*pt.y +
                                            m.at<float>(0, 2),
                                            m.at<float>(1, 0)*pt.x +
                                            m.at<float>(1, 1)*pt.y +
                                            m.at<float>(1, 2));
        }
}

There is another related type, InputArrayOfArrays, which is currently defined as a synonym for InputArray:

typedef InputArray InputArrayOfArrays;

It denotes function arguments that are either vectors of vectors or vectors of matrices. A separate synonym is needed to generate Python/Java etc. wrappers properly. At the function implementation level their use is similar, but _InputArray::getMat(idx) should be used to get header for the idx-th component of the outer vector and _InputArray::size().area() should be used to find the number of components (vectors/matrices) of the outer vector.