繁体   English   中英

我可以使用opencv函数,例如cv :: multiply与std :: vector <cv::Mat> 作为输入和输出参数?

[英]Can I use opencv functions such as cv::multiply with std::vector<cv::Mat> as input and output arguments?

阅读opencv的文档,在我看来,我可以使用std :: vector作为接收InputArray并输出OutputArray类的任何函数的输入和输出参数,例如cv::multiply

http://docs.opencv.org/master/d4/d32/classcv_1_1__InputArray.html#gsc.tab=0

http://docs.opencv.org/master/d2/de8/group__core__array.html#ga979d898a58d7f61c53003e162e7ad89f

但是,我似乎无法使其工作:

float data[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

cv::Mat mat = cv::Mat(3, 3, CV_32F, data);

std::vector<cv::Mat> vecMat = {mat, mat, mat};


std::vector<cv::Mat> outputVecMat;
cv::multiply(vecMat, vecMat, outputVecMat);

我在这里做错什么了吗?还是错过了解释文档的机会?

InputArray 基本上是围绕cv::Matstd::vector<T>的包装类。 但是multiply (除法相同)需要一维或二维矩阵。 例如,有效的代码可能是:

#include <opencv2/opencv.hpp>
#include <vector>

int main()
{
    float data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    cv::Mat mat = cv::Mat(3, 3, CV_32F, data);

    // Multiply cv::Mat
    cv::Mat outMat;
    cv::multiply(mat, mat, outMat);

    // Multiply std::vector
    std::vector<float> vec(data, data + 9);
    std::vector<float> outVec;
    cv::multiply(vec, vec, outVec);

    return 0;
}

如果要将矩阵乘以std::vector<cv::Mat> (具有3个维度),则需要做一些额外的工作,定义自己的函数(此处为mymul ):

#include <opencv2/opencv.hpp>
#include <vector>


void mymul(const std::vector<cv::Mat>& src1, const std::vector<cv::Mat>& src2, std::vector<cv::Mat>& dst)
{
    dst.clear();

    // Be sure that src1 and src2 have the same number of elements
    CV_Assert(src1.size() == src2.size());

    dst.resize(src1.size());

    for (int i = 0; i < src1.size(); ++i)
    {
        cv::multiply(src1[i], src2[i], dst[i]);
    }
}

int main()
{
    float data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    cv::Mat mat = cv::Mat(3, 3, CV_32F, data);

    std::vector<cv::Mat> vecMat = { mat, mat, mat };

    std::vector<cv::Mat> outputVecMat;

    // Call custom multiply that works on std::vector<cv::Mat>
    mymul(vecMat, vecMat, outputVecMat);

    return 0;
}

这里的问题不是 InputArray不正确。 实际上,它是用等于STD_VECTOR_MAT kind正确创建的。 的问题multiply预计InputArray是任一个cv::Mat或一个std::vector<T>其中T是一个内置的类型( intfloat ,等...)。

您可以看到,接受std::vector<cv::Mat> OpenCV函数具有cv::InputArrayOfArrayscv::OutputArrayOfArrays类型的参数,其中std::vector T类型显然是cv::Mat的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM