读取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);
我在这里做错了什么或者只是错过了解释文档?
答案 0 :(得分:2)
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::Mat
或std::vector<T>
,其中T
是内置的在类型(int
,float
等等...)。
您可以看到接受std::vector<cv::Mat>
的OpenCV函数具有cv::InputArrayOfArrays
或cv::OutputArrayOfArrays
类型的参数,其中T
的类型std::vector
显然是输入cv::Mat
。