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

标签 c++ opencv image-processing

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

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::Mat的包装类和 std::vector<T> .但是multiply (除法相同)需要一个 1 或 2 维矩阵。例如,有效代码可以是:

#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未正确形成。它实际上是使用 kind 正确创建的等于 STD_VECTOR_MAT .问题 multiply期望 InputArray要么是cv::Matstd::vector<T> , 其中T是内置类型( intfloat 等...)。

您可以看到接受 std::vector<cv::Mat> 的 OpenCV 函数具有 cv::InputArrayOfArrays 类型的参数或 cv::OutputArrayOfArrays , 哪里清楚类型 Tstd::vector类型为 cv::Mat .

关于c++ - 我可以使用 opencv 函数,例如 cv::multiply 和 std::vector<cv::Mat> 作为输入和输出参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35432075/

相关文章:

c++ - 两位数月份格式的Arduino打印

c++ - 巨大的静态数组与函数内的局部数组

c++ - main() 的函数类型

c++ - OpenCV - 如何以 Mat 形式编写 IplImage 数组?

java - 在当前帧之前存储视频帧?

php - 我可以从 Flash 文件动态生成 300 dpi 图像吗?

c++ - 我可以使用 reinterpret_cast 将指向成员函数的指针转换为 char 数组并返回吗?

c++ - 如何修复 'undefined reference' 错误 opencv 和 g++

node.js - Node -opencv/小牛 : dyld: Symbol not found

python - Numpy 根据条件更改多维数组上的所有元素