cv::_InputArray cv::_OutputArray

Posted liuxin0430

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cv::_InputArray cv::_OutputArray相关的知识,希望对你有一定的参考价值。

cv::_InputArray和cv::_OutputArray用于传参数,可以适应不同的类型,如 Mat, Matx, vector 之类。对于传入参数既可能是cv::Mat有可能是std::vector的非常建议使用,这也是很多opencv内部函数的常见参数。
官方文档中有一个简单的官方示例:

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));
        }
}

上述的示例给我们演示了InputArray和OutputArray传递cv::Mat的例子,对于std::vector<cv::Mat>的情况:
InputArray很简单,std::vector<cv::Mat> images; _src.getMatVector(images);
OutputArray需要知道其大小,对于我们明确outputArray大小的,我们用

void cv::Mat::create ( int ndims, const int * sizes, int type)  

sizes是用来设置这个outputArray的大小的,然后就可以用getMatVector来建立联系(construct a matrix header for the array (without copying data)),这个和InputArray是类似做法。

对于不知道大小的,可以先用一个临时变量保存这个我们要捆绑的vector<cv::Mat>,取出它的size,一样需要进行create,但是之后是直接用assign(tmp)
比如:

//cv::InputArray src, cv::OutputArray dst 这是传入的参数
cv::Mat image = src.getMat();
outImages = func(image);//outImages是std::vector<cv::Mat>
        
int size = {1,1};
size[1] = outImages.size();
dst.create(2, size, image.type()); 
dst.assign(out_images);

注意:
void cv::_InputArray::copyTo(const _OutputArray & arr) const无法直接拷贝一个vector,即使这个函数的参数是OutputArray,因为其源代码里根本没有判断k == STD_VECTOR_MAT的类别
而bool _InputArray::empty() const是可以对各种类型的input进行是否为空的判断。(这个函数在modules/core/src/matrix_wrap.cpp)。

官方文档其实并不完全清晰,可以考虑看源代码进行辅助理解。
源代码:https://github.com/opencv/opencv

以上是关于cv::_InputArray cv::_OutputArray的主要内容,如果未能解决你的问题,请参考以下文章

line_det.cpp:(.text+0x1299):对‘cv::imshow(cv::String const&, cv::_InputArray const&)’未定义的引用 l

line_det.cpp:(.text+0x1299):对‘cv::imshow(cv::String const&, cv::_InputArray const&)’未定义的引用 l

opencv中的csv文件要怎么做?

void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int),文件 /../Linux/./../src/ 中的断言失败 (scn == 3

将 Qt QByteArray 转换为 OpenCV cv::InputArray

Android NDK 错误:无法声明对 cv::InputArray 的引用