cv::_InputArray cv::_OutputArray


cv::_InputArray和cv::_OutputArray用於傳參數,可以適應不同的類型,如 Mat, Matx, vector 之類。對於傳入參數既可能是cv::Mat有可能是std::vector cv::Mat的非常建議使用,這也是很多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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM